]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - tools/power/acpi/os_specific/service_layers/osunixxf.c
UBUNTU: Ubuntu-4.13.0-45.50
[mirror_ubuntu-artful-kernel.git] / tools / power / acpi / os_specific / service_layers / osunixxf.c
CommitLineData
83b80bac
LZ
1/******************************************************************************
2 *
3 * Module Name: osunixxf - UNIX OSL interfaces
4 *
5 *****************************************************************************/
6
7/*
7735ca0e 8 * Copyright (C) 2000 - 2017, Intel Corp.
83b80bac
LZ
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/*
45 * These interfaces are required in order to compile the ASL compiler and the
46 * various ACPICA tools under Linux or other Unix-like system.
47 */
48#include <acpi/acpi.h>
49#include "accommon.h"
50#include "amlcode.h"
51#include "acparser.h"
52#include "acdebug.h"
53
54#include <stdio.h>
55#include <stdlib.h>
56#include <stdarg.h>
57#include <unistd.h>
58#include <sys/time.h>
59#include <semaphore.h>
60#include <pthread.h>
61#include <errno.h>
62
63#define _COMPONENT ACPI_OS_SERVICES
64ACPI_MODULE_NAME("osunixxf")
65
83b80bac 66/* Upcalls to acpi_exec */
83b80bac
LZ
67void
68ae_table_override(struct acpi_table_header *existing_table,
69 struct acpi_table_header **new_table);
70
71typedef void *(*PTHREAD_CALLBACK) (void *);
72
73/* Buffer used by acpi_os_vprintf */
74
75#define ACPI_VPRINTF_BUFFER_SIZE 512
76#define _ASCII_NEWLINE '\n'
77
78/* Terminal support for acpi_exec only */
79
80#ifdef ACPI_EXEC_APP
81#include <termios.h>
82
83struct termios original_term_attributes;
84int term_attributes_were_set = 0;
85
86acpi_status acpi_ut_read_line(char *buffer, u32 buffer_length, u32 *bytes_read);
87
88static void os_enter_line_edit_mode(void);
89
90static void os_exit_line_edit_mode(void);
91
92/******************************************************************************
93 *
94 * FUNCTION: os_enter_line_edit_mode, os_exit_line_edit_mode
95 *
96 * PARAMETERS: None
97 *
98 * RETURN: None
99 *
100 * DESCRIPTION: Enter/Exit the raw character input mode for the terminal.
101 *
102 * Interactive line-editing support for the AML debugger. Used with the
103 * common/acgetline module.
104 *
105 * readline() is not used because of non-portability. It is not available
106 * on all systems, and if it is, often the package must be manually installed.
107 *
108 * Therefore, we use the POSIX tcgetattr/tcsetattr and do the minimal line
109 * editing that we need in acpi_os_get_line.
110 *
111 * If the POSIX tcgetattr/tcsetattr interfaces are unavailable, these
112 * calls will also work:
113 * For os_enter_line_edit_mode: system ("stty cbreak -echo")
114 * For os_exit_line_edit_mode: system ("stty cooked echo")
115 *
116 *****************************************************************************/
117
118static void os_enter_line_edit_mode(void)
119{
120 struct termios local_term_attributes;
121
63c9043b
BM
122 term_attributes_were_set = 0;
123
124 /* STDIN must be a terminal */
125
126 if (!isatty(STDIN_FILENO)) {
127 return;
128 }
129
83b80bac
LZ
130 /* Get and keep the original attributes */
131
132 if (tcgetattr(STDIN_FILENO, &original_term_attributes)) {
133 fprintf(stderr, "Could not get terminal attributes!\n");
134 return;
135 }
136
137 /* Set the new attributes to enable raw character input */
138
139 memcpy(&local_term_attributes, &original_term_attributes,
140 sizeof(struct termios));
141
142 local_term_attributes.c_lflag &= ~(ICANON | ECHO);
143 local_term_attributes.c_cc[VMIN] = 1;
144 local_term_attributes.c_cc[VTIME] = 0;
145
146 if (tcsetattr(STDIN_FILENO, TCSANOW, &local_term_attributes)) {
147 fprintf(stderr, "Could not set terminal attributes!\n");
148 return;
149 }
150
151 term_attributes_were_set = 1;
152}
153
154static void os_exit_line_edit_mode(void)
155{
156
157 if (!term_attributes_were_set) {
158 return;
159 }
160
161 /* Set terminal attributes back to the original values */
162
163 if (tcsetattr(STDIN_FILENO, TCSANOW, &original_term_attributes)) {
164 fprintf(stderr, "Could not restore terminal attributes!\n");
165 }
166}
167
168#else
169
170/* These functions are not needed for other ACPICA utilities */
171
172#define os_enter_line_edit_mode()
173#define os_exit_line_edit_mode()
174#endif
175
176/******************************************************************************
177 *
178 * FUNCTION: acpi_os_initialize, acpi_os_terminate
179 *
180 * PARAMETERS: None
181 *
182 * RETURN: Status
183 *
184 * DESCRIPTION: Initialize and terminate this module.
185 *
186 *****************************************************************************/
187
188acpi_status acpi_os_initialize(void)
189{
80a648c1 190 acpi_status status;
83b80bac
LZ
191
192 acpi_gbl_output_file = stdout;
193
194 os_enter_line_edit_mode();
80a648c1
LZ
195
196 status = acpi_os_create_lock(&acpi_gbl_print_lock);
197 if (ACPI_FAILURE(status)) {
198 return (status);
199 }
200
83b80bac
LZ
201 return (AE_OK);
202}
203
204acpi_status acpi_os_terminate(void)
205{
206
207 os_exit_line_edit_mode();
208 return (AE_OK);
209}
210
211#ifndef ACPI_USE_NATIVE_RSDP_POINTER
212/******************************************************************************
213 *
214 * FUNCTION: acpi_os_get_root_pointer
215 *
216 * PARAMETERS: None
217 *
218 * RETURN: RSDP physical address
219 *
220 * DESCRIPTION: Gets the ACPI root pointer (RSDP)
221 *
222 *****************************************************************************/
223
224acpi_physical_address acpi_os_get_root_pointer(void)
225{
226
227 return (0);
228}
229#endif
230
231/******************************************************************************
232 *
233 * FUNCTION: acpi_os_predefined_override
234 *
235 * PARAMETERS: init_val - Initial value of the predefined object
236 * new_val - The new value for the object
237 *
238 * RETURN: Status, pointer to value. Null pointer returned if not
239 * overriding.
240 *
241 * DESCRIPTION: Allow the OS to override predefined names
242 *
243 *****************************************************************************/
244
245acpi_status
f5c1e1c5
LZ
246acpi_os_predefined_override(const struct acpi_predefined_names *init_val,
247 acpi_string *new_val)
83b80bac
LZ
248{
249
250 if (!init_val || !new_val) {
251 return (AE_BAD_PARAMETER);
252 }
253
254 *new_val = NULL;
255 return (AE_OK);
256}
257
258/******************************************************************************
259 *
260 * FUNCTION: acpi_os_table_override
261 *
262 * PARAMETERS: existing_table - Header of current table (probably
263 * firmware)
264 * new_table - Where an entire new table is returned.
265 *
266 * RETURN: Status, pointer to new table. Null pointer returned if no
267 * table is available to override
268 *
269 * DESCRIPTION: Return a different version of a table if one is available
270 *
271 *****************************************************************************/
272
273acpi_status
f5c1e1c5
LZ
274acpi_os_table_override(struct acpi_table_header *existing_table,
275 struct acpi_table_header **new_table)
83b80bac
LZ
276{
277
278 if (!existing_table || !new_table) {
279 return (AE_BAD_PARAMETER);
280 }
281
282 *new_table = NULL;
283
284#ifdef ACPI_EXEC_APP
285
286 ae_table_override(existing_table, new_table);
287 return (AE_OK);
288#else
289
290 return (AE_NO_ACPI_TABLES);
291#endif
292}
293
294/******************************************************************************
295 *
296 * FUNCTION: acpi_os_physical_table_override
297 *
298 * PARAMETERS: existing_table - Header of current table (probably firmware)
299 * new_address - Where new table address is returned
300 * (Physical address)
301 * new_table_length - Where new table length is returned
302 *
303 * RETURN: Status, address/length of new table. Null pointer returned
304 * if no table is available to override.
305 *
306 * DESCRIPTION: Returns AE_SUPPORT, function not used in user space.
307 *
308 *****************************************************************************/
309
310acpi_status
f5c1e1c5
LZ
311acpi_os_physical_table_override(struct acpi_table_header *existing_table,
312 acpi_physical_address *new_address,
83b80bac
LZ
313 u32 *new_table_length)
314{
315
316 return (AE_SUPPORT);
317}
318
0fc5e8f4
LZ
319/******************************************************************************
320 *
321 * FUNCTION: acpi_os_enter_sleep
322 *
323 * PARAMETERS: sleep_state - Which sleep state to enter
324 * rega_value - Register A value
325 * regb_value - Register B value
326 *
327 * RETURN: Status
328 *
329 * DESCRIPTION: A hook before writing sleep registers to enter the sleep
330 * state. Return AE_CTRL_TERMINATE to skip further sleep register
331 * writes.
332 *
333 *****************************************************************************/
334
335acpi_status acpi_os_enter_sleep(u8 sleep_state, u32 rega_value, u32 regb_value)
336{
337
338 return (AE_OK);
339}
340
83b80bac
LZ
341/******************************************************************************
342 *
343 * FUNCTION: acpi_os_redirect_output
344 *
345 * PARAMETERS: destination - An open file handle/pointer
346 *
347 * RETURN: None
348 *
349 * DESCRIPTION: Causes redirect of acpi_os_printf and acpi_os_vprintf
350 *
351 *****************************************************************************/
352
353void acpi_os_redirect_output(void *destination)
354{
355
356 acpi_gbl_output_file = destination;
357}
358
359/******************************************************************************
360 *
361 * FUNCTION: acpi_os_printf
362 *
363 * PARAMETERS: fmt, ... - Standard printf format
364 *
365 * RETURN: None
366 *
367 * DESCRIPTION: Formatted output. Note: very similar to acpi_os_vprintf
368 * (performance), changes should be tracked in both functions.
369 *
370 *****************************************************************************/
371
372void ACPI_INTERNAL_VAR_XFACE acpi_os_printf(const char *fmt, ...)
373{
374 va_list args;
375 u8 flags;
376
377 flags = acpi_gbl_db_output_flags;
378 if (flags & ACPI_DB_REDIRECTABLE_OUTPUT) {
379
380 /* Output is directable to either a file (if open) or the console */
381
382 if (acpi_gbl_debug_file) {
383
384 /* Output file is open, send the output there */
385
386 va_start(args, fmt);
387 vfprintf(acpi_gbl_debug_file, fmt, args);
388 va_end(args);
389 } else {
390 /* No redirection, send output to console (once only!) */
391
392 flags |= ACPI_DB_CONSOLE_OUTPUT;
393 }
394 }
395
396 if (flags & ACPI_DB_CONSOLE_OUTPUT) {
397 va_start(args, fmt);
398 vfprintf(acpi_gbl_output_file, fmt, args);
399 va_end(args);
400 }
401}
402
403/******************************************************************************
404 *
405 * FUNCTION: acpi_os_vprintf
406 *
407 * PARAMETERS: fmt - Standard printf format
408 * args - Argument list
409 *
410 * RETURN: None
411 *
412 * DESCRIPTION: Formatted output with argument list pointer. Note: very
413 * similar to acpi_os_printf, changes should be tracked in both
414 * functions.
415 *
416 *****************************************************************************/
417
418void acpi_os_vprintf(const char *fmt, va_list args)
419{
420 u8 flags;
421 char buffer[ACPI_VPRINTF_BUFFER_SIZE];
422
423 /*
424 * We build the output string in a local buffer because we may be
425 * outputting the buffer twice. Using vfprintf is problematic because
426 * some implementations modify the args pointer/structure during
427 * execution. Thus, we use the local buffer for portability.
428 *
429 * Note: Since this module is intended for use by the various ACPICA
430 * utilities/applications, we can safely declare the buffer on the stack.
431 * Also, This function is used for relatively small error messages only.
432 */
433 vsnprintf(buffer, ACPI_VPRINTF_BUFFER_SIZE, fmt, args);
434
435 flags = acpi_gbl_db_output_flags;
436 if (flags & ACPI_DB_REDIRECTABLE_OUTPUT) {
437
438 /* Output is directable to either a file (if open) or the console */
439
440 if (acpi_gbl_debug_file) {
441
442 /* Output file is open, send the output there */
443
444 fputs(buffer, acpi_gbl_debug_file);
445 } else {
446 /* No redirection, send output to console (once only!) */
447
448 flags |= ACPI_DB_CONSOLE_OUTPUT;
449 }
450 }
451
452 if (flags & ACPI_DB_CONSOLE_OUTPUT) {
453 fputs(buffer, acpi_gbl_output_file);
454 }
455}
456
457#ifndef ACPI_EXEC_APP
458/******************************************************************************
459 *
460 * FUNCTION: acpi_os_get_line
461 *
462 * PARAMETERS: buffer - Where to return the command line
463 * buffer_length - Maximum length of Buffer
464 * bytes_read - Where the actual byte count is returned
465 *
466 * RETURN: Status and actual bytes read
467 *
468 * DESCRIPTION: Get the next input line from the terminal. NOTE: For the
469 * acpi_exec utility, we use the acgetline module instead to
470 * provide line-editing and history support.
471 *
472 *****************************************************************************/
473
474acpi_status acpi_os_get_line(char *buffer, u32 buffer_length, u32 *bytes_read)
475{
476 int input_char;
477 u32 end_of_line;
478
479 /* Standard acpi_os_get_line for all utilities except acpi_exec */
480
481 for (end_of_line = 0;; end_of_line++) {
482 if (end_of_line >= buffer_length) {
483 return (AE_BUFFER_OVERFLOW);
484 }
485
486 if ((input_char = getchar()) == EOF) {
487 return (AE_ERROR);
488 }
489
490 if (!input_char || input_char == _ASCII_NEWLINE) {
491 break;
492 }
493
494 buffer[end_of_line] = (char)input_char;
495 }
496
497 /* Null terminate the buffer */
498
499 buffer[end_of_line] = 0;
500
501 /* Return the number of bytes in the string */
502
503 if (bytes_read) {
504 *bytes_read = end_of_line;
505 }
506
507 return (AE_OK);
508}
509#endif
510
511#ifndef ACPI_USE_NATIVE_MEMORY_MAPPING
512/******************************************************************************
513 *
514 * FUNCTION: acpi_os_map_memory
515 *
516 * PARAMETERS: where - Physical address of memory to be mapped
517 * length - How much memory to map
518 *
519 * RETURN: Pointer to mapped memory. Null on error.
520 *
521 * DESCRIPTION: Map physical memory into caller's address space
522 *
523 *****************************************************************************/
524
525void *acpi_os_map_memory(acpi_physical_address where, acpi_size length)
526{
527
f5c1e1c5 528 return (ACPI_TO_POINTER((acpi_size)where));
83b80bac
LZ
529}
530
531/******************************************************************************
532 *
533 * FUNCTION: acpi_os_unmap_memory
534 *
535 * PARAMETERS: where - Logical address of memory to be unmapped
536 * length - How much memory to unmap
537 *
538 * RETURN: None.
539 *
540 * DESCRIPTION: Delete a previously created mapping. Where and Length must
541 * correspond to a previous mapping exactly.
542 *
543 *****************************************************************************/
544
545void acpi_os_unmap_memory(void *where, acpi_size length)
546{
547
548 return;
549}
550#endif
551
552/******************************************************************************
553 *
554 * FUNCTION: acpi_os_allocate
555 *
556 * PARAMETERS: size - Amount to allocate, in bytes
557 *
558 * RETURN: Pointer to the new allocation. Null on error.
559 *
560 * DESCRIPTION: Allocate memory. Algorithm is dependent on the OS.
561 *
562 *****************************************************************************/
563
564void *acpi_os_allocate(acpi_size size)
565{
566 void *mem;
567
568 mem = (void *)malloc((size_t) size);
569 return (mem);
570}
571
572#ifdef USE_NATIVE_ALLOCATE_ZEROED
573/******************************************************************************
574 *
575 * FUNCTION: acpi_os_allocate_zeroed
576 *
577 * PARAMETERS: size - Amount to allocate, in bytes
578 *
579 * RETURN: Pointer to the new allocation. Null on error.
580 *
581 * DESCRIPTION: Allocate and zero memory. Algorithm is dependent on the OS.
582 *
583 *****************************************************************************/
584
585void *acpi_os_allocate_zeroed(acpi_size size)
586{
587 void *mem;
588
589 mem = (void *)calloc(1, (size_t) size);
590 return (mem);
591}
592#endif
593
594/******************************************************************************
595 *
596 * FUNCTION: acpi_os_free
597 *
598 * PARAMETERS: mem - Pointer to previously allocated memory
599 *
600 * RETURN: None.
601 *
602 * DESCRIPTION: Free memory allocated via acpi_os_allocate
603 *
604 *****************************************************************************/
605
606void acpi_os_free(void *mem)
607{
608
609 free(mem);
610}
611
612#ifdef ACPI_SINGLE_THREADED
613/******************************************************************************
614 *
615 * FUNCTION: Semaphore stub functions
616 *
617 * DESCRIPTION: Stub functions used for single-thread applications that do
618 * not require semaphore synchronization. Full implementations
619 * of these functions appear after the stubs.
620 *
621 *****************************************************************************/
622
623acpi_status
624acpi_os_create_semaphore(u32 max_units,
f5c1e1c5 625 u32 initial_units, acpi_handle *out_handle)
83b80bac 626{
f5c1e1c5 627 *out_handle = (acpi_handle)1;
83b80bac
LZ
628 return (AE_OK);
629}
630
631acpi_status acpi_os_delete_semaphore(acpi_handle handle)
632{
633 return (AE_OK);
634}
635
636acpi_status acpi_os_wait_semaphore(acpi_handle handle, u32 units, u16 timeout)
637{
638 return (AE_OK);
639}
640
641acpi_status acpi_os_signal_semaphore(acpi_handle handle, u32 units)
642{
643 return (AE_OK);
644}
645
646#else
647/******************************************************************************
648 *
649 * FUNCTION: acpi_os_create_semaphore
650 *
651 * PARAMETERS: initial_units - Units to be assigned to the new semaphore
652 * out_handle - Where a handle will be returned
653 *
654 * RETURN: Status
655 *
656 * DESCRIPTION: Create an OS semaphore
657 *
658 *****************************************************************************/
659
660acpi_status
661acpi_os_create_semaphore(u32 max_units,
f5c1e1c5 662 u32 initial_units, acpi_handle *out_handle)
83b80bac
LZ
663{
664 sem_t *sem;
665
666 if (!out_handle) {
667 return (AE_BAD_PARAMETER);
668 }
669#ifdef __APPLE__
670 {
6c9fd7ed
LZ
671 static int semaphore_count = 0;
672 char semaphore_name[32];
83b80bac 673
6c9fd7ed
LZ
674 snprintf(semaphore_name, sizeof(semaphore_name), "acpi_sem_%d",
675 semaphore_count++);
676 printf("%s\n", semaphore_name);
83b80bac
LZ
677 sem =
678 sem_open(semaphore_name, O_EXCL | O_CREAT, 0755,
679 initial_units);
680 if (!sem) {
681 return (AE_NO_MEMORY);
682 }
683 sem_unlink(semaphore_name); /* This just deletes the name */
684 }
685
686#else
687 sem = acpi_os_allocate(sizeof(sem_t));
688 if (!sem) {
689 return (AE_NO_MEMORY);
690 }
691
692 if (sem_init(sem, 0, initial_units) == -1) {
693 acpi_os_free(sem);
694 return (AE_BAD_PARAMETER);
695 }
696#endif
697
f5c1e1c5 698 *out_handle = (acpi_handle)sem;
83b80bac
LZ
699 return (AE_OK);
700}
701
702/******************************************************************************
703 *
704 * FUNCTION: acpi_os_delete_semaphore
705 *
706 * PARAMETERS: handle - Handle returned by acpi_os_create_semaphore
707 *
708 * RETURN: Status
709 *
710 * DESCRIPTION: Delete an OS semaphore
711 *
712 *****************************************************************************/
713
714acpi_status acpi_os_delete_semaphore(acpi_handle handle)
715{
716 sem_t *sem = (sem_t *) handle;
717
718 if (!sem) {
719 return (AE_BAD_PARAMETER);
720 }
b97acdf1
LZ
721#ifdef __APPLE__
722 if (sem_close(sem) == -1) {
723 return (AE_BAD_PARAMETER);
724 }
725#else
83b80bac
LZ
726 if (sem_destroy(sem) == -1) {
727 return (AE_BAD_PARAMETER);
728 }
b97acdf1 729#endif
83b80bac
LZ
730
731 return (AE_OK);
732}
733
734/******************************************************************************
735 *
736 * FUNCTION: acpi_os_wait_semaphore
737 *
738 * PARAMETERS: handle - Handle returned by acpi_os_create_semaphore
739 * units - How many units to wait for
740 * msec_timeout - How long to wait (milliseconds)
741 *
742 * RETURN: Status
743 *
744 * DESCRIPTION: Wait for units
745 *
746 *****************************************************************************/
747
748acpi_status
749acpi_os_wait_semaphore(acpi_handle handle, u32 units, u16 msec_timeout)
750{
751 acpi_status status = AE_OK;
752 sem_t *sem = (sem_t *) handle;
fdf8707b 753 int ret_val;
83b80bac
LZ
754#ifndef ACPI_USE_ALTERNATE_TIMEOUT
755 struct timespec time;
83b80bac
LZ
756#endif
757
758 if (!sem) {
759 return (AE_BAD_PARAMETER);
760 }
761
762 switch (msec_timeout) {
763 /*
764 * No Wait:
765 * --------
766 * A zero timeout value indicates that we shouldn't wait - just
767 * acquire the semaphore if available otherwise return AE_TIME
768 * (a.k.a. 'would block').
769 */
770 case 0:
771
772 if (sem_trywait(sem) == -1) {
773 status = (AE_TIME);
774 }
775 break;
776
777 /* Wait Indefinitely */
778
779 case ACPI_WAIT_FOREVER:
780
fdf8707b
BM
781 while (((ret_val = sem_wait(sem)) == -1) && (errno == EINTR)) {
782 continue; /* Restart if interrupted */
783 }
784 if (ret_val != 0) {
83b80bac
LZ
785 status = (AE_TIME);
786 }
787 break;
788
789 /* Wait with msec_timeout */
790
791 default:
792
793#ifdef ACPI_USE_ALTERNATE_TIMEOUT
794 /*
795 * Alternate timeout mechanism for environments where
796 * sem_timedwait is not available or does not work properly.
797 */
798 while (msec_timeout) {
799 if (sem_trywait(sem) == 0) {
800
801 /* Got the semaphore */
802 return (AE_OK);
803 }
804
805 if (msec_timeout >= 10) {
806 msec_timeout -= 10;
807 usleep(10 * ACPI_USEC_PER_MSEC); /* ten milliseconds */
808 } else {
809 msec_timeout--;
810 usleep(ACPI_USEC_PER_MSEC); /* one millisecond */
811 }
812 }
813 status = (AE_TIME);
814#else
815 /*
816 * The interface to sem_timedwait is an absolute time, so we need to
817 * get the current time, then add in the millisecond Timeout value.
818 */
819 if (clock_gettime(CLOCK_REALTIME, &time) == -1) {
820 perror("clock_gettime");
821 return (AE_TIME);
822 }
823
824 time.tv_sec += (msec_timeout / ACPI_MSEC_PER_SEC);
825 time.tv_nsec +=
826 ((msec_timeout % ACPI_MSEC_PER_SEC) * ACPI_NSEC_PER_MSEC);
827
828 /* Handle nanosecond overflow (field must be less than one second) */
829
830 if (time.tv_nsec >= ACPI_NSEC_PER_SEC) {
831 time.tv_sec += (time.tv_nsec / ACPI_NSEC_PER_SEC);
832 time.tv_nsec = (time.tv_nsec % ACPI_NSEC_PER_SEC);
833 }
834
835 while (((ret_val = sem_timedwait(sem, &time)) == -1)
836 && (errno == EINTR)) {
fdf8707b
BM
837 continue; /* Restart if interrupted */
838
83b80bac
LZ
839 }
840
841 if (ret_val != 0) {
842 if (errno != ETIMEDOUT) {
843 perror("sem_timedwait");
844 }
845 status = (AE_TIME);
846 }
847#endif
848 break;
849 }
850
851 return (status);
852}
853
854/******************************************************************************
855 *
856 * FUNCTION: acpi_os_signal_semaphore
857 *
858 * PARAMETERS: handle - Handle returned by acpi_os_create_semaphore
859 * units - Number of units to send
860 *
861 * RETURN: Status
862 *
863 * DESCRIPTION: Send units
864 *
865 *****************************************************************************/
866
867acpi_status acpi_os_signal_semaphore(acpi_handle handle, u32 units)
868{
869 sem_t *sem = (sem_t *) handle;
870
871 if (!sem) {
872 return (AE_BAD_PARAMETER);
873 }
874
875 if (sem_post(sem) == -1) {
876 return (AE_LIMIT);
877 }
878
879 return (AE_OK);
880}
881
882#endif /* ACPI_SINGLE_THREADED */
883
884/******************************************************************************
885 *
886 * FUNCTION: Spinlock interfaces
887 *
888 * DESCRIPTION: Map these interfaces to semaphore interfaces
889 *
890 *****************************************************************************/
891
892acpi_status acpi_os_create_lock(acpi_spinlock * out_handle)
893{
894
895 return (acpi_os_create_semaphore(1, 1, out_handle));
896}
897
898void acpi_os_delete_lock(acpi_spinlock handle)
899{
900 acpi_os_delete_semaphore(handle);
901}
902
903acpi_cpu_flags acpi_os_acquire_lock(acpi_handle handle)
904{
905 acpi_os_wait_semaphore(handle, 1, 0xFFFF);
906 return (0);
907}
908
909void acpi_os_release_lock(acpi_spinlock handle, acpi_cpu_flags flags)
910{
911 acpi_os_signal_semaphore(handle, 1);
912}
913
914/******************************************************************************
915 *
916 * FUNCTION: acpi_os_install_interrupt_handler
917 *
918 * PARAMETERS: interrupt_number - Level handler should respond to.
919 * isr - Address of the ACPI interrupt handler
920 * except_ptr - Where status is returned
921 *
922 * RETURN: Handle to the newly installed handler.
923 *
924 * DESCRIPTION: Install an interrupt handler. Used to install the ACPI
925 * OS-independent handler.
926 *
927 *****************************************************************************/
928
929u32
930acpi_os_install_interrupt_handler(u32 interrupt_number,
931 acpi_osd_handler service_routine,
932 void *context)
933{
934
935 return (AE_OK);
936}
937
938/******************************************************************************
939 *
940 * FUNCTION: acpi_os_remove_interrupt_handler
941 *
942 * PARAMETERS: handle - Returned when handler was installed
943 *
944 * RETURN: Status
945 *
946 * DESCRIPTION: Uninstalls an interrupt handler.
947 *
948 *****************************************************************************/
949
950acpi_status
951acpi_os_remove_interrupt_handler(u32 interrupt_number,
952 acpi_osd_handler service_routine)
953{
954
955 return (AE_OK);
956}
957
958/******************************************************************************
959 *
960 * FUNCTION: acpi_os_stall
961 *
962 * PARAMETERS: microseconds - Time to sleep
963 *
964 * RETURN: Blocks until sleep is completed.
965 *
966 * DESCRIPTION: Sleep at microsecond granularity
967 *
968 *****************************************************************************/
969
970void acpi_os_stall(u32 microseconds)
971{
972
973 if (microseconds) {
974 usleep(microseconds);
975 }
976}
977
978/******************************************************************************
979 *
980 * FUNCTION: acpi_os_sleep
981 *
982 * PARAMETERS: milliseconds - Time to sleep
983 *
984 * RETURN: Blocks until sleep is completed.
985 *
986 * DESCRIPTION: Sleep at millisecond granularity
987 *
988 *****************************************************************************/
989
990void acpi_os_sleep(u64 milliseconds)
991{
992
993 /* Sleep for whole seconds */
994
995 sleep(milliseconds / ACPI_MSEC_PER_SEC);
996
997 /*
998 * Sleep for remaining microseconds.
999 * Arg to usleep() is in usecs and must be less than 1,000,000 (1 second).
1000 */
1001 usleep((milliseconds % ACPI_MSEC_PER_SEC) * ACPI_USEC_PER_MSEC);
1002}
1003
1004/******************************************************************************
1005 *
1006 * FUNCTION: acpi_os_get_timer
1007 *
1008 * PARAMETERS: None
1009 *
1010 * RETURN: Current time in 100 nanosecond units
1011 *
1012 * DESCRIPTION: Get the current system time
1013 *
1014 *****************************************************************************/
1015
1016u64 acpi_os_get_timer(void)
1017{
1018 struct timeval time;
1019
1020 /* This timer has sufficient resolution for user-space application code */
1021
1022 gettimeofday(&time, NULL);
1023
1024 /* (Seconds * 10^7 = 100ns(10^-7)) + (Microseconds(10^-6) * 10^1 = 100ns) */
1025
1026 return (((u64)time.tv_sec * ACPI_100NSEC_PER_SEC) +
1027 ((u64)time.tv_usec * ACPI_100NSEC_PER_USEC));
1028}
1029
1030/******************************************************************************
1031 *
1032 * FUNCTION: acpi_os_read_pci_configuration
1033 *
1034 * PARAMETERS: pci_id - Seg/Bus/Dev
1035 * pci_register - Device Register
1036 * value - Buffer where value is placed
1037 * width - Number of bits
1038 *
1039 * RETURN: Status
1040 *
1041 * DESCRIPTION: Read data from PCI configuration space
1042 *
1043 *****************************************************************************/
1044
1045acpi_status
1046acpi_os_read_pci_configuration(struct acpi_pci_id *pci_id,
1047 u32 pci_register, u64 *value, u32 width)
1048{
1049
1050 *value = 0;
1051 return (AE_OK);
1052}
1053
1054/******************************************************************************
1055 *
1056 * FUNCTION: acpi_os_write_pci_configuration
1057 *
1058 * PARAMETERS: pci_id - Seg/Bus/Dev
1059 * pci_register - Device Register
1060 * value - Value to be written
1061 * width - Number of bits
1062 *
1063 * RETURN: Status.
1064 *
1065 * DESCRIPTION: Write data to PCI configuration space
1066 *
1067 *****************************************************************************/
1068
1069acpi_status
f5c1e1c5 1070acpi_os_write_pci_configuration(struct acpi_pci_id *pci_id,
83b80bac
LZ
1071 u32 pci_register, u64 value, u32 width)
1072{
1073
1074 return (AE_OK);
1075}
1076
1077/******************************************************************************
1078 *
1079 * FUNCTION: acpi_os_read_port
1080 *
1081 * PARAMETERS: address - Address of I/O port/register to read
1082 * value - Where value is placed
1083 * width - Number of bits
1084 *
1085 * RETURN: Value read from port
1086 *
1087 * DESCRIPTION: Read data from an I/O port or register
1088 *
1089 *****************************************************************************/
1090
1091acpi_status acpi_os_read_port(acpi_io_address address, u32 *value, u32 width)
1092{
1093
1094 switch (width) {
1095 case 8:
1096
1097 *value = 0xFF;
1098 break;
1099
1100 case 16:
1101
1102 *value = 0xFFFF;
1103 break;
1104
1105 case 32:
1106
1107 *value = 0xFFFFFFFF;
1108 break;
1109
1110 default:
1111
1112 return (AE_BAD_PARAMETER);
1113 }
1114
1115 return (AE_OK);
1116}
1117
1118/******************************************************************************
1119 *
1120 * FUNCTION: acpi_os_write_port
1121 *
1122 * PARAMETERS: address - Address of I/O port/register to write
1123 * value - Value to write
1124 * width - Number of bits
1125 *
1126 * RETURN: None
1127 *
1128 * DESCRIPTION: Write data to an I/O port or register
1129 *
1130 *****************************************************************************/
1131
1132acpi_status acpi_os_write_port(acpi_io_address address, u32 value, u32 width)
1133{
1134
1135 return (AE_OK);
1136}
1137
1138/******************************************************************************
1139 *
1140 * FUNCTION: acpi_os_read_memory
1141 *
1142 * PARAMETERS: address - Physical Memory Address to read
1143 * value - Where value is placed
1144 * width - Number of bits (8,16,32, or 64)
1145 *
1146 * RETURN: Value read from physical memory address. Always returned
1147 * as a 64-bit integer, regardless of the read width.
1148 *
1149 * DESCRIPTION: Read data from a physical memory address
1150 *
1151 *****************************************************************************/
1152
1153acpi_status
1154acpi_os_read_memory(acpi_physical_address address, u64 *value, u32 width)
1155{
1156
1157 switch (width) {
1158 case 8:
1159 case 16:
1160 case 32:
1161 case 64:
1162
1163 *value = 0;
1164 break;
1165
1166 default:
1167
1168 return (AE_BAD_PARAMETER);
1169 }
1170 return (AE_OK);
1171}
1172
1173/******************************************************************************
1174 *
1175 * FUNCTION: acpi_os_write_memory
1176 *
1177 * PARAMETERS: address - Physical Memory Address to write
1178 * value - Value to write
1179 * width - Number of bits (8,16,32, or 64)
1180 *
1181 * RETURN: None
1182 *
1183 * DESCRIPTION: Write data to a physical memory address
1184 *
1185 *****************************************************************************/
1186
1187acpi_status
1188acpi_os_write_memory(acpi_physical_address address, u64 value, u32 width)
1189{
1190
1191 return (AE_OK);
1192}
1193
1194/******************************************************************************
1195 *
1196 * FUNCTION: acpi_os_readable
1197 *
1198 * PARAMETERS: pointer - Area to be verified
1199 * length - Size of area
1200 *
1201 * RETURN: TRUE if readable for entire length
1202 *
1203 * DESCRIPTION: Verify that a pointer is valid for reading
1204 *
1205 *****************************************************************************/
1206
1207u8 acpi_os_readable(void *pointer, acpi_size length)
1208{
1209
1210 return (TRUE);
1211}
1212
1213/******************************************************************************
1214 *
1215 * FUNCTION: acpi_os_writable
1216 *
1217 * PARAMETERS: pointer - Area to be verified
1218 * length - Size of area
1219 *
1220 * RETURN: TRUE if writable for entire length
1221 *
1222 * DESCRIPTION: Verify that a pointer is valid for writing
1223 *
1224 *****************************************************************************/
1225
1226u8 acpi_os_writable(void *pointer, acpi_size length)
1227{
1228
1229 return (TRUE);
1230}
1231
1232/******************************************************************************
1233 *
1234 * FUNCTION: acpi_os_signal
1235 *
1236 * PARAMETERS: function - ACPI A signal function code
1237 * info - Pointer to function-dependent structure
1238 *
1239 * RETURN: Status
1240 *
1241 * DESCRIPTION: Miscellaneous functions. Example implementation only.
1242 *
1243 *****************************************************************************/
1244
1245acpi_status acpi_os_signal(u32 function, void *info)
1246{
1247
1248 switch (function) {
1249 case ACPI_SIGNAL_FATAL:
1250
1251 break;
1252
1253 case ACPI_SIGNAL_BREAKPOINT:
1254
1255 break;
1256
1257 default:
1258
1259 break;
1260 }
1261
1262 return (AE_OK);
1263}
1264
1265/* Optional multi-thread support */
1266
1267#ifndef ACPI_SINGLE_THREADED
1268/******************************************************************************
1269 *
1270 * FUNCTION: acpi_os_get_thread_id
1271 *
1272 * PARAMETERS: None
1273 *
1274 * RETURN: Id of the running thread
1275 *
1276 * DESCRIPTION: Get the ID of the current (running) thread
1277 *
1278 *****************************************************************************/
1279
1280acpi_thread_id acpi_os_get_thread_id(void)
1281{
1282 pthread_t thread;
1283
1284 thread = pthread_self();
1285 return (ACPI_CAST_PTHREAD_T(thread));
1286}
1287
1288/******************************************************************************
1289 *
1290 * FUNCTION: acpi_os_execute
1291 *
1292 * PARAMETERS: type - Type of execution
1293 * function - Address of the function to execute
1294 * context - Passed as a parameter to the function
1295 *
1296 * RETURN: Status.
1297 *
1298 * DESCRIPTION: Execute a new thread
1299 *
1300 *****************************************************************************/
1301
1302acpi_status
1303acpi_os_execute(acpi_execute_type type,
1304 acpi_osd_exec_callback function, void *context)
1305{
1306 pthread_t thread;
1307 int ret;
1308
1309 ret =
1310 pthread_create(&thread, NULL, (PTHREAD_CALLBACK) function, context);
1311 if (ret) {
1312 acpi_os_printf("Create thread failed");
1313 }
1314 return (0);
1315}
1316
1317#else /* ACPI_SINGLE_THREADED */
1318acpi_thread_id acpi_os_get_thread_id(void)
1319{
1320 return (1);
1321}
1322
1323acpi_status
1324acpi_os_execute(acpi_execute_type type,
1325 acpi_osd_exec_callback function, void *context)
1326{
1327
1328 function(context);
1329
1330 return (AE_OK);
1331}
1332
1333#endif /* ACPI_SINGLE_THREADED */
1334
1335/******************************************************************************
1336 *
1337 * FUNCTION: acpi_os_wait_events_complete
1338 *
1339 * PARAMETERS: None
1340 *
1341 * RETURN: None
1342 *
1343 * DESCRIPTION: Wait for all asynchronous events to complete. This
1344 * implementation does nothing.
1345 *
1346 *****************************************************************************/
1347
1348void acpi_os_wait_events_complete(void)
1349{
1350 return;
1351}