osunixxf.c revision 223480
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
70extern FILE                    *AcpiGbl_DebugFile;
71FILE                           *AcpiGbl_OutputFile;
72
73
74/* Upcalls to AcpiExec */
75
76ACPI_PHYSICAL_ADDRESS
77AeLocalGetRootPointer (
78    void);
79
80void
81AeTableOverride (
82    ACPI_TABLE_HEADER       *ExistingTable,
83    ACPI_TABLE_HEADER       **NewTable);
84
85typedef 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
106ACPI_STATUS
107AcpiOsInitialize (
108    void)
109{
110
111    AcpiGbl_OutputFile = stdout;
112    return (AE_OK);
113}
114
115
116ACPI_STATUS
117AcpiOsTerminate (
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
137ACPI_PHYSICAL_ADDRESS
138AcpiOsGetRootPointer (
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
160ACPI_STATUS
161AcpiOsPredefinedOverride (
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
191ACPI_STATUS
192AcpiOsTableOverride (
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
227void
228AcpiOsRedirectOutput (
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
248void ACPI_INTERNAL_VAR_XFACE
249AcpiOsPrintf (
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
275void
276AcpiOsVprintf (
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
324ACPI_STATUS
325AcpiOsGetLine (
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
377void *
378AcpiOsMapMemory (
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
401void
402AcpiOsUnmapMemory (
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
423void *
424AcpiOsAllocate (
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
447void
448AcpiOsFree (
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
467ACPI_STATUS
468AcpiOsCreateSemaphore (
469    UINT32              MaxUnits,
470    UINT32              InitialUnits,
471    ACPI_HANDLE         *OutHandle)
472{
473    *OutHandle = (ACPI_HANDLE) 1;
474    return (AE_OK);
475}
476
477ACPI_STATUS
478AcpiOsDeleteSemaphore (
479    ACPI_HANDLE         Handle)
480{
481    return (AE_OK);
482}
483
484ACPI_STATUS
485AcpiOsWaitSemaphore (
486    ACPI_HANDLE         Handle,
487    UINT32              Units,
488    UINT16              Timeout)
489{
490    return (AE_OK);
491}
492
493ACPI_STATUS
494AcpiOsSignalSemaphore (
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
515ACPI_STATUS
516AcpiOsCreateSemaphore (
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
572ACPI_STATUS
573AcpiOsDeleteSemaphore (
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
607ACPI_STATUS
608AcpiOsWaitSemaphore (
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
701ACPI_STATUS
702AcpiOsSignalSemaphore (
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
733ACPI_STATUS
734AcpiOsCreateLock (
735    ACPI_SPINLOCK           *OutHandle)
736{
737
738    return (AcpiOsCreateSemaphore (1, 1, OutHandle));
739}
740
741
742void
743AcpiOsDeleteLock (
744    ACPI_SPINLOCK           Handle)
745{
746    AcpiOsDeleteSemaphore (Handle);
747}
748
749
750ACPI_CPU_FLAGS
751AcpiOsAcquireLock (
752    ACPI_HANDLE             Handle)
753{
754    AcpiOsWaitSemaphore (Handle, 1, 0xFFFF);
755    return (0);
756}
757
758
759void
760AcpiOsReleaseLock (
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
783UINT32
784AcpiOsInstallInterruptHandler (
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
806ACPI_STATUS
807AcpiOsRemoveInterruptHandler (
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
828void
829AcpiOsStall (
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
852void
853AcpiOsSleep (
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
878UINT64
879AcpiOsGetTimer (
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
908ACPI_STATUS
909AcpiOsReadPciConfiguration (
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
935ACPI_STATUS
936AcpiOsWritePciConfiguration (
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
961ACPI_STATUS
962AcpiOsReadPort (
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
1004ACPI_STATUS
1005AcpiOsWritePort (
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
1029ACPI_STATUS
1030AcpiOsReadMemory (
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
1065ACPI_STATUS
1066AcpiOsWriteMemory (
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
1089BOOLEAN
1090AcpiOsReadable (
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
1112BOOLEAN
1113AcpiOsWritable (
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
1135ACPI_STATUS
1136AcpiOsSignal (
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
1171ACPI_THREAD_ID
1172AcpiOsGetThreadId (
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
1194ACPI_STATUS
1195AcpiOsExecute (
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