osunixxf.c revision 1.1.1.3 1 /******************************************************************************
2 *
3 * Module Name: osunixxf - UNIX OSL interfaces
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2011, 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
45 /*
46 * These interfaces are required in order to compile the ASL compiler and the
47 * various ACPICA tools under Linux or other Unix-like system.
48 *
49 * Note: Use #define __APPLE__ for OS X generation.
50 */
51 #include "acpi.h"
52 #include "accommon.h"
53 #include "amlcode.h"
54 #include "acparser.h"
55 #include "acdebug.h"
56
57 #include <stdio.h>
58 #include <stdlib.h>
59 #include <stdarg.h>
60 #include <unistd.h>
61 #include <sys/time.h>
62 #include <semaphore.h>
63 #include <pthread.h>
64 #include <errno.h>
65
66 #define _COMPONENT ACPI_OS_SERVICES
67 ACPI_MODULE_NAME ("osunixxf")
68
69
70 extern FILE *AcpiGbl_DebugFile;
71 FILE *AcpiGbl_OutputFile;
72
73
74 /* Upcalls to AcpiExec */
75
76 ACPI_PHYSICAL_ADDRESS
77 AeLocalGetRootPointer (
78 void);
79
80 void
81 AeTableOverride (
82 ACPI_TABLE_HEADER *ExistingTable,
83 ACPI_TABLE_HEADER **NewTable);
84
85 typedef void* (*PTHREAD_CALLBACK) (void *);
86
87 /* Apple-specific */
88
89 #ifdef __APPLE__
90 #define sem_destroy sem_close
91 #endif
92
93
94 /******************************************************************************
95 *
96 * FUNCTION: AcpiOsInitialize, AcpiOsTerminate
97 *
98 * PARAMETERS: None
99 *
100 * RETURN: Status
101 *
102 * DESCRIPTION: Init and terminate. Nothing to do.
103 *
104 *****************************************************************************/
105
106 ACPI_STATUS
107 AcpiOsInitialize (
108 void)
109 {
110
111 AcpiGbl_OutputFile = stdout;
112 return (AE_OK);
113 }
114
115
116 ACPI_STATUS
117 AcpiOsTerminate (
118 void)
119 {
120
121 return (AE_OK);
122 }
123
124
125 /******************************************************************************
126 *
127 * FUNCTION: AcpiOsGetRootPointer
128 *
129 * PARAMETERS: None
130 *
131 * RETURN: RSDP physical address
132 *
133 * DESCRIPTION: Gets the ACPI root pointer (RSDP)
134 *
135 *****************************************************************************/
136
137 ACPI_PHYSICAL_ADDRESS
138 AcpiOsGetRootPointer (
139 void)
140 {
141
142 return (AeLocalGetRootPointer ());
143 }
144
145
146 /******************************************************************************
147 *
148 * FUNCTION: AcpiOsPredefinedOverride
149 *
150 * PARAMETERS: InitVal - Initial value of the predefined object
151 * NewVal - The new value for the object
152 *
153 * RETURN: Status, pointer to value. Null pointer returned if not
154 * overriding.
155 *
156 * DESCRIPTION: Allow the OS to override predefined names
157 *
158 *****************************************************************************/
159
160 ACPI_STATUS
161 AcpiOsPredefinedOverride (
162 const ACPI_PREDEFINED_NAMES *InitVal,
163 ACPI_STRING *NewVal)
164 {
165
166 if (!InitVal || !NewVal)
167 {
168 return (AE_BAD_PARAMETER);
169 }
170
171 *NewVal = NULL;
172 return (AE_OK);
173 }
174
175
176 /******************************************************************************
177 *
178 * FUNCTION: AcpiOsTableOverride
179 *
180 * PARAMETERS: ExistingTable - Header of current table (probably
181 * firmware)
182 * NewTable - Where an entire new table is returned.
183 *
184 * RETURN: Status, pointer to new table. Null pointer returned if no
185 * table is available to override
186 *
187 * DESCRIPTION: Return a different version of a table if one is available
188 *
189 *****************************************************************************/
190
191 ACPI_STATUS
192 AcpiOsTableOverride (
193 ACPI_TABLE_HEADER *ExistingTable,
194 ACPI_TABLE_HEADER **NewTable)
195 {
196
197 if (!ExistingTable || !NewTable)
198 {
199 return (AE_BAD_PARAMETER);
200 }
201
202 *NewTable = NULL;
203
204 #ifdef ACPI_EXEC_APP
205
206 AeTableOverride (ExistingTable, NewTable);
207 return (AE_OK);
208 #else
209
210 return (AE_NO_ACPI_TABLES);
211 #endif
212 }
213
214
215 /******************************************************************************
216 *
217 * FUNCTION: AcpiOsRedirectOutput
218 *
219 * PARAMETERS: Destination - An open file handle/pointer
220 *
221 * RETURN: None
222 *
223 * DESCRIPTION: Causes redirect of AcpiOsPrintf and AcpiOsVprintf
224 *
225 *****************************************************************************/
226
227 void
228 AcpiOsRedirectOutput (
229 void *Destination)
230 {
231
232 AcpiGbl_OutputFile = Destination;
233 }
234
235
236 /******************************************************************************
237 *
238 * FUNCTION: AcpiOsPrintf
239 *
240 * PARAMETERS: fmt, ... - Standard printf format
241 *
242 * RETURN: None
243 *
244 * DESCRIPTION: Formatted output
245 *
246 *****************************************************************************/
247
248 void ACPI_INTERNAL_VAR_XFACE
249 AcpiOsPrintf (
250 const char *Fmt,
251 ...)
252 {
253 va_list Args;
254
255
256 va_start (Args, Fmt);
257 AcpiOsVprintf (Fmt, Args);
258 va_end (Args);
259 }
260
261
262 /******************************************************************************
263 *
264 * FUNCTION: AcpiOsVprintf
265 *
266 * PARAMETERS: fmt - Standard printf format
267 * args - Argument list
268 *
269 * RETURN: None
270 *
271 * DESCRIPTION: Formatted output with argument list pointer
272 *
273 *****************************************************************************/
274
275 void
276 AcpiOsVprintf (
277 const char *Fmt,
278 va_list Args)
279 {
280 INT32 Count = 0;
281 UINT8 Flags;
282
283
284 Flags = AcpiGbl_DbOutputFlags;
285 if (Flags & ACPI_DB_REDIRECTABLE_OUTPUT)
286 {
287 /* Output is directable to either a file (if open) or the console */
288
289 if (AcpiGbl_DebugFile)
290 {
291 /* Output file is open, send the output there */
292
293 Count = vfprintf (AcpiGbl_DebugFile, Fmt, Args);
294 }
295 else
296 {
297 /* No redirection, send output to console (once only!) */
298
299 Flags |= ACPI_DB_CONSOLE_OUTPUT;
300 }
301 }
302
303 if (Flags & ACPI_DB_CONSOLE_OUTPUT)
304 {
305 Count = vfprintf (AcpiGbl_OutputFile, Fmt, Args);
306 }
307 }
308
309
310 /******************************************************************************
311 *
312 * FUNCTION: AcpiOsGetLine
313 *
314 * PARAMETERS: Buffer - Where to return the command line
315 * BufferLength - Maximum length of Buffer
316 * BytesRead - Where the actual byte count is returned
317 *
318 * RETURN: Status and actual bytes read
319 *
320 * DESCRIPTION: Formatted input with argument list pointer
321 *
322 *****************************************************************************/
323
324 ACPI_STATUS
325 AcpiOsGetLine (
326 char *Buffer,
327 UINT32 BufferLength,
328 UINT32 *BytesRead)
329 {
330 UINT8 Temp;
331 UINT32 i;
332
333
334 for (i = 0; ; i++)
335 {
336 if (i >= BufferLength)
337 {
338 return (AE_BUFFER_OVERFLOW);
339 }
340
341 scanf ("%1c", &Temp);
342 if (!Temp || Temp == '\n')
343 {
344 break;
345 }
346
347 Buffer [i] = Temp;
348 }
349
350 /* Null terminate the buffer */
351
352 Buffer [i] = 0;
353
354 /* Return the number of bytes in the string */
355
356 if (BytesRead)
357 {
358 *BytesRead = i;
359 }
360 return (AE_OK);
361 }
362
363
364 /******************************************************************************
365 *
366 * FUNCTION: AcpiOsMapMemory
367 *
368 * PARAMETERS: where - Physical address of memory to be mapped
369 * length - How much memory to map
370 *
371 * RETURN: Pointer to mapped memory. Null on error.
372 *
373 * DESCRIPTION: Map physical memory into caller's address space
374 *
375 *****************************************************************************/
376
377 void *
378 AcpiOsMapMemory (
379 ACPI_PHYSICAL_ADDRESS where,
380 ACPI_SIZE length)
381 {
382
383 return (ACPI_TO_POINTER ((ACPI_SIZE) where));
384 }
385
386
387 /******************************************************************************
388 *
389 * FUNCTION: AcpiOsUnmapMemory
390 *
391 * PARAMETERS: where - Logical address of memory to be unmapped
392 * length - How much memory to unmap
393 *
394 * RETURN: None.
395 *
396 * DESCRIPTION: Delete a previously created mapping. Where and Length must
397 * correspond to a previous mapping exactly.
398 *
399 *****************************************************************************/
400
401 void
402 AcpiOsUnmapMemory (
403 void *where,
404 ACPI_SIZE length)
405 {
406
407 return;
408 }
409
410
411 /******************************************************************************
412 *
413 * FUNCTION: AcpiOsAllocate
414 *
415 * PARAMETERS: Size - Amount to allocate, in bytes
416 *
417 * RETURN: Pointer to the new allocation. Null on error.
418 *
419 * DESCRIPTION: Allocate memory. Algorithm is dependent on the OS.
420 *
421 *****************************************************************************/
422
423 void *
424 AcpiOsAllocate (
425 ACPI_SIZE size)
426 {
427 void *Mem;
428
429
430 Mem = (void *) malloc ((size_t) size);
431 return (Mem);
432 }
433
434
435 /******************************************************************************
436 *
437 * FUNCTION: AcpiOsFree
438 *
439 * PARAMETERS: mem - Pointer to previously allocated memory
440 *
441 * RETURN: None.
442 *
443 * DESCRIPTION: Free memory allocated via AcpiOsAllocate
444 *
445 *****************************************************************************/
446
447 void
448 AcpiOsFree (
449 void *mem)
450 {
451
452 free (mem);
453 }
454
455
456 #ifdef ACPI_SINGLE_THREADED
457 /******************************************************************************
458 *
459 * FUNCTION: Semaphore stub functions
460 *
461 * DESCRIPTION: Stub functions used for single-thread applications that do
462 * not require semaphore synchronization. Full implementations
463 * of these functions appear after the stubs.
464 *
465 *****************************************************************************/
466
467 ACPI_STATUS
468 AcpiOsCreateSemaphore (
469 UINT32 MaxUnits,
470 UINT32 InitialUnits,
471 ACPI_HANDLE *OutHandle)
472 {
473 *OutHandle = (ACPI_HANDLE) 1;
474 return (AE_OK);
475 }
476
477 ACPI_STATUS
478 AcpiOsDeleteSemaphore (
479 ACPI_HANDLE Handle)
480 {
481 return (AE_OK);
482 }
483
484 ACPI_STATUS
485 AcpiOsWaitSemaphore (
486 ACPI_HANDLE Handle,
487 UINT32 Units,
488 UINT16 Timeout)
489 {
490 return (AE_OK);
491 }
492
493 ACPI_STATUS
494 AcpiOsSignalSemaphore (
495 ACPI_HANDLE Handle,
496 UINT32 Units)
497 {
498 return (AE_OK);
499 }
500
501 #else
502 /******************************************************************************
503 *
504 * FUNCTION: AcpiOsCreateSemaphore
505 *
506 * PARAMETERS: InitialUnits - Units to be assigned to the new semaphore
507 * OutHandle - Where a handle will be returned
508 *
509 * RETURN: Status
510 *
511 * DESCRIPTION: Create an OS semaphore
512 *
513 *****************************************************************************/
514
515 ACPI_STATUS
516 AcpiOsCreateSemaphore (
517 UINT32 MaxUnits,
518 UINT32 InitialUnits,
519 ACPI_HANDLE *OutHandle)
520 {
521 sem_t *Sem;
522
523
524 if (!OutHandle)
525 {
526 return (AE_BAD_PARAMETER);
527 }
528
529 #ifdef __APPLE__
530 {
531 char *SemaphoreName = tmpnam (NULL);
532
533 Sem = sem_open (SemaphoreName, O_EXCL|O_CREAT, 0755, InitialUnits);
534 if (!Sem)
535 {
536 return (AE_NO_MEMORY);
537 }
538 sem_unlink (SemaphoreName); /* This just deletes the name */
539 }
540
541 #else
542 Sem = AcpiOsAllocate (sizeof (sem_t));
543 if (!Sem)
544 {
545 return (AE_NO_MEMORY);
546 }
547
548 if (sem_init (Sem, 0, InitialUnits) == -1)
549 {
550 AcpiOsFree (Sem);
551 return (AE_BAD_PARAMETER);
552 }
553 #endif
554
555 *OutHandle = (ACPI_HANDLE) Sem;
556 return (AE_OK);
557 }
558
559
560 /******************************************************************************
561 *
562 * FUNCTION: AcpiOsDeleteSemaphore
563 *
564 * PARAMETERS: Handle - Handle returned by AcpiOsCreateSemaphore
565 *
566 * RETURN: Status
567 *
568 * DESCRIPTION: Delete an OS semaphore
569 *
570 *****************************************************************************/
571
572 ACPI_STATUS
573 AcpiOsDeleteSemaphore (
574 ACPI_HANDLE Handle)
575 {
576 sem_t *Sem = (sem_t *) Handle;
577
578
579 if (!Sem)
580 {
581 return (AE_BAD_PARAMETER);
582 }
583
584 if (sem_destroy (Sem) == -1)
585 {
586 return (AE_BAD_PARAMETER);
587 }
588
589 return (AE_OK);
590 }
591
592
593 /******************************************************************************
594 *
595 * FUNCTION: AcpiOsWaitSemaphore
596 *
597 * PARAMETERS: Handle - Handle returned by AcpiOsCreateSemaphore
598 * Units - How many units to wait for
599 * Timeout - How long to wait
600 *
601 * RETURN: Status
602 *
603 * DESCRIPTION: Wait for units
604 *
605 *****************************************************************************/
606
607 ACPI_STATUS
608 AcpiOsWaitSemaphore (
609 ACPI_HANDLE Handle,
610 UINT32 Units,
611 UINT16 Timeout)
612 {
613 ACPI_STATUS Status = AE_OK;
614 sem_t *Sem = (sem_t *) Handle;
615 struct timespec T;
616
617
618 if (!Sem)
619 {
620 return (AE_BAD_PARAMETER);
621 }
622
623 switch (Timeout)
624 {
625 /*
626 * No Wait:
627 * --------
628 * A zero timeout value indicates that we shouldn't wait - just
629 * acquire the semaphore if available otherwise return AE_TIME
630 * (a.k.a. 'would block').
631 */
632 case 0:
633
634 if (sem_trywait(Sem) == -1)
635 {
636 Status = (AE_TIME);
637 }
638 break;
639
640 /* Wait Indefinitely */
641
642 case ACPI_WAIT_FOREVER:
643
644 if (sem_wait (Sem))
645 {
646 Status = (AE_TIME);
647 }
648 break;
649
650 /* Wait with Timeout */
651
652 default:
653
654 T.tv_sec = Timeout / 1000;
655 T.tv_nsec = (Timeout - (T.tv_sec * 1000)) * 1000000;
656
657 #ifdef ACPI_USE_ALTERNATE_TIMEOUT
658 /*
659 * Alternate timeout mechanism for environments where
660 * sem_timedwait is not available or does not work properly.
661 */
662 while (Timeout)
663 {
664 if (sem_trywait (Sem) == 0)
665 {
666 /* Got the semaphore */
667 return (AE_OK);
668 }
669 usleep (1000); /* one millisecond */
670 Timeout--;
671 }
672 Status = (AE_TIME);
673 #else
674
675 if (sem_timedwait (Sem, &T))
676 {
677 Status = (AE_TIME);
678 }
679 #endif
680
681 break;
682 }
683
684 return (Status);
685 }
686
687
688 /******************************************************************************
689 *
690 * FUNCTION: AcpiOsSignalSemaphore
691 *
692 * PARAMETERS: Handle - Handle returned by AcpiOsCreateSemaphore
693 * Units - Number of units to send
694 *
695 * RETURN: Status
696 *
697 * DESCRIPTION: Send units
698 *
699 *****************************************************************************/
700
701 ACPI_STATUS
702 AcpiOsSignalSemaphore (
703 ACPI_HANDLE Handle,
704 UINT32 Units)
705 {
706 sem_t *Sem = (sem_t *)Handle;
707
708
709 if (!Sem)
710 {
711 return (AE_BAD_PARAMETER);
712 }
713
714 if (sem_post (Sem) == -1)
715 {
716 return (AE_LIMIT);
717 }
718
719 return (AE_OK);
720 }
721
722 #endif /* ACPI_SINGLE_THREADED */
723
724
725 /******************************************************************************
726 *
727 * FUNCTION: Spinlock interfaces
728 *
729 * DESCRIPTION: Map these interfaces to semaphore interfaces
730 *
731 *****************************************************************************/
732
733 ACPI_STATUS
734 AcpiOsCreateLock (
735 ACPI_SPINLOCK *OutHandle)
736 {
737
738 return (AcpiOsCreateSemaphore (1, 1, OutHandle));
739 }
740
741
742 void
743 AcpiOsDeleteLock (
744 ACPI_SPINLOCK Handle)
745 {
746 AcpiOsDeleteSemaphore (Handle);
747 }
748
749
750 ACPI_CPU_FLAGS
751 AcpiOsAcquireLock (
752 ACPI_HANDLE Handle)
753 {
754 AcpiOsWaitSemaphore (Handle, 1, 0xFFFF);
755 return (0);
756 }
757
758
759 void
760 AcpiOsReleaseLock (
761 ACPI_SPINLOCK Handle,
762 ACPI_CPU_FLAGS Flags)
763 {
764 AcpiOsSignalSemaphore (Handle, 1);
765 }
766
767
768 /******************************************************************************
769 *
770 * FUNCTION: AcpiOsInstallInterruptHandler
771 *
772 * PARAMETERS: InterruptNumber - Level handler should respond to.
773 * Isr - Address of the ACPI interrupt handler
774 * ExceptPtr - Where status is returned
775 *
776 * RETURN: Handle to the newly installed handler.
777 *
778 * DESCRIPTION: Install an interrupt handler. Used to install the ACPI
779 * OS-independent handler.
780 *
781 *****************************************************************************/
782
783 UINT32
784 AcpiOsInstallInterruptHandler (
785 UINT32 InterruptNumber,
786 ACPI_OSD_HANDLER ServiceRoutine,
787 void *Context)
788 {
789
790 return (AE_OK);
791 }
792
793
794 /******************************************************************************
795 *
796 * FUNCTION: AcpiOsRemoveInterruptHandler
797 *
798 * PARAMETERS: Handle - Returned when handler was installed
799 *
800 * RETURN: Status
801 *
802 * DESCRIPTION: Uninstalls an interrupt handler.
803 *
804 *****************************************************************************/
805
806 ACPI_STATUS
807 AcpiOsRemoveInterruptHandler (
808 UINT32 InterruptNumber,
809 ACPI_OSD_HANDLER ServiceRoutine)
810 {
811
812 return (AE_OK);
813 }
814
815
816 /******************************************************************************
817 *
818 * FUNCTION: AcpiOsStall
819 *
820 * PARAMETERS: microseconds - Time to sleep
821 *
822 * RETURN: Blocks until sleep is completed.
823 *
824 * DESCRIPTION: Sleep at microsecond granularity
825 *
826 *****************************************************************************/
827
828 void
829 AcpiOsStall (
830 UINT32 microseconds)
831 {
832
833 if (microseconds)
834 {
835 usleep (microseconds);
836 }
837 }
838
839
840 /******************************************************************************
841 *
842 * FUNCTION: AcpiOsSleep
843 *
844 * PARAMETERS: milliseconds - Time to sleep
845 *
846 * RETURN: Blocks until sleep is completed.
847 *
848 * DESCRIPTION: Sleep at millisecond granularity
849 *
850 *****************************************************************************/
851
852 void
853 AcpiOsSleep (
854 UINT64 milliseconds)
855 {
856
857 sleep (milliseconds / 1000); /* Sleep for whole seconds */
858
859 /*
860 * Arg to usleep() must be less than 1,000,000 (1 second)
861 */
862 usleep ((milliseconds % 1000) * 1000); /* Sleep for remaining usecs */
863 }
864
865
866 /******************************************************************************
867 *
868 * FUNCTION: AcpiOsGetTimer
869 *
870 * PARAMETERS: None
871 *
872 * RETURN: Current time in 100 nanosecond units
873 *
874 * DESCRIPTION: Get the current system time
875 *
876 *****************************************************************************/
877
878 UINT64
879 AcpiOsGetTimer (
880 void)
881 {
882 struct timeval time;
883
884
885 gettimeofday (&time, NULL);
886
887 /* Seconds * 10^7 = 100ns(10^-7), Microseconds(10^-6) * 10^1 = 100ns */
888
889 return (((UINT64) time.tv_sec * 10000000) + ((UINT64) time.tv_usec * 10));
890 }
891
892
893 /******************************************************************************
894 *
895 * FUNCTION: AcpiOsReadPciConfiguration
896 *
897 * PARAMETERS: PciId - Seg/Bus/Dev
898 * Register - Device Register
899 * Value - Buffer where value is placed
900 * Width - Number of bits
901 *
902 * RETURN: Status
903 *
904 * DESCRIPTION: Read data from PCI configuration space
905 *
906 *****************************************************************************/
907
908 ACPI_STATUS
909 AcpiOsReadPciConfiguration (
910 ACPI_PCI_ID *PciId,
911 UINT32 Register,
912 UINT64 *Value,
913 UINT32 Width)
914 {
915
916 return (AE_OK);
917 }
918
919
920 /******************************************************************************
921 *
922 * FUNCTION: AcpiOsWritePciConfiguration
923 *
924 * PARAMETERS: PciId - Seg/Bus/Dev
925 * Register - Device Register
926 * Value - Value to be written
927 * Width - Number of bits
928 *
929 * RETURN: Status.
930 *
931 * DESCRIPTION: Write data to PCI configuration space
932 *
933 *****************************************************************************/
934
935 ACPI_STATUS
936 AcpiOsWritePciConfiguration (
937 ACPI_PCI_ID *PciId,
938 UINT32 Register,
939 UINT64 Value,
940 UINT32 Width)
941 {
942
943 return (AE_OK);
944 }
945
946
947 /******************************************************************************
948 *
949 * FUNCTION: AcpiOsReadPort
950 *
951 * PARAMETERS: Address - Address of I/O port/register to read
952 * Value - Where value is placed
953 * Width - Number of bits
954 *
955 * RETURN: Value read from port
956 *
957 * DESCRIPTION: Read data from an I/O port or register
958 *
959 *****************************************************************************/
960
961 ACPI_STATUS
962 AcpiOsReadPort (
963 ACPI_IO_ADDRESS Address,
964 UINT32 *Value,
965 UINT32 Width)
966 {
967
968 switch (Width)
969 {
970 case 8:
971 *Value = 0xFF;
972 break;
973
974 case 16:
975 *Value = 0xFFFF;
976 break;
977
978 case 32:
979 *Value = 0xFFFFFFFF;
980 break;
981
982 default:
983 return (AE_BAD_PARAMETER);
984 }
985
986 return (AE_OK);
987 }
988
989
990 /******************************************************************************
991 *
992 * FUNCTION: AcpiOsWritePort
993 *
994 * PARAMETERS: Address - Address of I/O port/register to write
995 * Value - Value to write
996 * Width - Number of bits
997 *
998 * RETURN: None
999 *
1000 * DESCRIPTION: Write data to an I/O port or register
1001 *
1002 *****************************************************************************/
1003
1004 ACPI_STATUS
1005 AcpiOsWritePort (
1006 ACPI_IO_ADDRESS Address,
1007 UINT32 Value,
1008 UINT32 Width)
1009 {
1010
1011 return (AE_OK);
1012 }
1013
1014
1015 /******************************************************************************
1016 *
1017 * FUNCTION: AcpiOsReadMemory
1018 *
1019 * PARAMETERS: Address - Physical Memory Address to read
1020 * Value - Where value is placed
1021 * Width - Number of bits
1022 *
1023 * RETURN: Value read from physical memory address
1024 *
1025 * DESCRIPTION: Read data from a physical memory address
1026 *
1027 *****************************************************************************/
1028
1029 ACPI_STATUS
1030 AcpiOsReadMemory (
1031 ACPI_PHYSICAL_ADDRESS Address,
1032 UINT32 *Value,
1033 UINT32 Width)
1034 {
1035
1036 switch (Width)
1037 {
1038 case 8:
1039 case 16:
1040 case 32:
1041 *Value = 0;
1042 break;
1043
1044 default:
1045 return (AE_BAD_PARAMETER);
1046 }
1047 return (AE_OK);
1048 }
1049
1050
1051 /******************************************************************************
1052 *
1053 * FUNCTION: AcpiOsWriteMemory
1054 *
1055 * PARAMETERS: Address - Physical Memory Address to write
1056 * Value - Value to write
1057 * Width - Number of bits
1058 *
1059 * RETURN: None
1060 *
1061 * DESCRIPTION: Write data to a physical memory address
1062 *
1063 *****************************************************************************/
1064
1065 ACPI_STATUS
1066 AcpiOsWriteMemory (
1067 ACPI_PHYSICAL_ADDRESS Address,
1068 UINT32 Value,
1069 UINT32 Width)
1070 {
1071
1072 return (AE_OK);
1073 }
1074
1075
1076 /******************************************************************************
1077 *
1078 * FUNCTION: AcpiOsReadable
1079 *
1080 * PARAMETERS: Pointer - Area to be verified
1081 * Length - Size of area
1082 *
1083 * RETURN: TRUE if readable for entire length
1084 *
1085 * DESCRIPTION: Verify that a pointer is valid for reading
1086 *
1087 *****************************************************************************/
1088
1089 BOOLEAN
1090 AcpiOsReadable (
1091 void *Pointer,
1092 ACPI_SIZE Length)
1093 {
1094
1095 return (TRUE);
1096 }
1097
1098
1099 /******************************************************************************
1100 *
1101 * FUNCTION: AcpiOsWritable
1102 *
1103 * PARAMETERS: Pointer - Area to be verified
1104 * Length - Size of area
1105 *
1106 * RETURN: TRUE if writable for entire length
1107 *
1108 * DESCRIPTION: Verify that a pointer is valid for writing
1109 *
1110 *****************************************************************************/
1111
1112 BOOLEAN
1113 AcpiOsWritable (
1114 void *Pointer,
1115 ACPI_SIZE Length)
1116 {
1117
1118 return (TRUE);
1119 }
1120
1121
1122 /******************************************************************************
1123 *
1124 * FUNCTION: AcpiOsSignal
1125 *
1126 * PARAMETERS: Function - ACPI CA signal function code
1127 * Info - Pointer to function-dependent structure
1128 *
1129 * RETURN: Status
1130 *
1131 * DESCRIPTION: Miscellaneous functions. Example implementation only.
1132 *
1133 *****************************************************************************/
1134
1135 ACPI_STATUS
1136 AcpiOsSignal (
1137 UINT32 Function,
1138 void *Info)
1139 {
1140
1141 switch (Function)
1142 {
1143 case ACPI_SIGNAL_FATAL:
1144 break;
1145
1146 case ACPI_SIGNAL_BREAKPOINT:
1147 break;
1148
1149 default:
1150 break;
1151 }
1152
1153 return (AE_OK);
1154 }
1155
1156 /* Optional multi-thread support */
1157
1158 #ifndef ACPI_SINGLE_THREADED
1159 /******************************************************************************
1160 *
1161 * FUNCTION: AcpiOsGetThreadId
1162 *
1163 * PARAMETERS: None
1164 *
1165 * RETURN: Id of the running thread
1166 *
1167 * DESCRIPTION: Get the ID of the current (running) thread
1168 *
1169 *****************************************************************************/
1170
1171 ACPI_THREAD_ID
1172 AcpiOsGetThreadId (
1173 void)
1174 {
1175
1176 return (ACPI_CAST_PTHREAD_T (pthread_self()));
1177 }
1178
1179
1180 /******************************************************************************
1181 *
1182 * FUNCTION: AcpiOsExecute
1183 *
1184 * PARAMETERS: Type - Type of execution
1185 * Function - Address of the function to execute
1186 * Context - Passed as a parameter to the function
1187 *
1188 * RETURN: Status.
1189 *
1190 * DESCRIPTION: Execute a new thread
1191 *
1192 *****************************************************************************/
1193
1194 ACPI_STATUS
1195 AcpiOsExecute (
1196 ACPI_EXECUTE_TYPE Type,
1197 ACPI_OSD_EXEC_CALLBACK Function,
1198 void *Context)
1199 {
1200 pthread_t thread;
1201 int ret;
1202
1203
1204 ret = pthread_create (&thread, NULL, (PTHREAD_CALLBACK) Function, Context);
1205 if (ret)
1206 {
1207 AcpiOsPrintf("Create thread failed");
1208 }
1209 return (0);
1210 }
1211
1212 #endif /* ACPI_SINGLE_THREADED */
1213