osunixxf.c revision 245582
1193267Sjkim/******************************************************************************
2193267Sjkim *
3193267Sjkim * Module Name: osunixxf - UNIX OSL interfaces
4193267Sjkim *
5193267Sjkim *****************************************************************************/
6193267Sjkim
7217355Sjkim/*
8245582Sjkim * Copyright (C) 2000 - 2013, Intel Corp.
9193267Sjkim * All rights reserved.
10193267Sjkim *
11217355Sjkim * Redistribution and use in source and binary forms, with or without
12217355Sjkim * modification, are permitted provided that the following conditions
13217355Sjkim * are met:
14217355Sjkim * 1. Redistributions of source code must retain the above copyright
15217355Sjkim *    notice, this list of conditions, and the following disclaimer,
16217355Sjkim *    without modification.
17217355Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18217355Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19217355Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20217355Sjkim *    including a substantially similar Disclaimer requirement for further
21217355Sjkim *    binary redistribution.
22217355Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23217355Sjkim *    of any contributors may be used to endorse or promote products derived
24217355Sjkim *    from this software without specific prior written permission.
25193267Sjkim *
26217355Sjkim * Alternatively, this software may be distributed under the terms of the
27217355Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28217355Sjkim * Software Foundation.
29193267Sjkim *
30217355Sjkim * NO WARRANTY
31217355Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32217355Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33217355Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34217355Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35217355Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36217355Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37217355Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38217355Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39217355Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40217355Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41217355Sjkim * POSSIBILITY OF SUCH DAMAGES.
42217355Sjkim */
43193267Sjkim
44193267Sjkim
45193267Sjkim/*
46213800Sjkim * These interfaces are required in order to compile the ASL compiler and the
47213800Sjkim * various ACPICA tools under Linux or other Unix-like system.
48209734Sjkim *
49209734Sjkim * Note: Use #define __APPLE__ for OS X generation.
50193267Sjkim */
51228110Sjkim#include <contrib/dev/acpica/include/acpi.h>
52228110Sjkim#include <contrib/dev/acpica/include/accommon.h>
53228110Sjkim#include <contrib/dev/acpica/include/amlcode.h>
54228110Sjkim#include <contrib/dev/acpica/include/acparser.h>
55228110Sjkim#include <contrib/dev/acpica/include/acdebug.h>
56223480Sjkim
57193267Sjkim#include <stdio.h>
58193267Sjkim#include <stdlib.h>
59193267Sjkim#include <stdarg.h>
60193267Sjkim#include <unistd.h>
61193267Sjkim#include <sys/time.h>
62193267Sjkim#include <semaphore.h>
63193267Sjkim#include <pthread.h>
64209734Sjkim#include <errno.h>
65193267Sjkim
66193267Sjkim#define _COMPONENT          ACPI_OS_SERVICES
67193267Sjkim        ACPI_MODULE_NAME    ("osunixxf")
68193267Sjkim
69193267Sjkim
70193267Sjkimextern FILE                    *AcpiGbl_DebugFile;
71193267SjkimFILE                           *AcpiGbl_OutputFile;
72193267Sjkim
73193267Sjkim
74193267Sjkim/* Upcalls to AcpiExec */
75193267Sjkim
76193267SjkimACPI_PHYSICAL_ADDRESS
77193267SjkimAeLocalGetRootPointer (
78193267Sjkim    void);
79193267Sjkim
80193267Sjkimvoid
81193267SjkimAeTableOverride (
82193267Sjkim    ACPI_TABLE_HEADER       *ExistingTable,
83193267Sjkim    ACPI_TABLE_HEADER       **NewTable);
84193267Sjkim
85193267Sjkimtypedef void* (*PTHREAD_CALLBACK) (void *);
86193267Sjkim
87245582Sjkim/* Buffer used by AcpiOsVprintf */
88245582Sjkim
89245582Sjkim#define ACPI_VPRINTF_BUFFER_SIZE        512
90245582Sjkim
91213800Sjkim/* Apple-specific */
92193267Sjkim
93213800Sjkim#ifdef __APPLE__
94213800Sjkim#define sem_destroy         sem_close
95213800Sjkim#endif
96213800Sjkim
97213800Sjkim
98193267Sjkim/******************************************************************************
99193267Sjkim *
100193267Sjkim * FUNCTION:    AcpiOsInitialize, AcpiOsTerminate
101193267Sjkim *
102193267Sjkim * PARAMETERS:  None
103193267Sjkim *
104193267Sjkim * RETURN:      Status
105193267Sjkim *
106213800Sjkim * DESCRIPTION: Init and terminate. Nothing to do.
107193267Sjkim *
108193267Sjkim *****************************************************************************/
109193267Sjkim
110193267SjkimACPI_STATUS
111213800SjkimAcpiOsInitialize (
112213800Sjkim    void)
113193267Sjkim{
114193267Sjkim
115193267Sjkim    AcpiGbl_OutputFile = stdout;
116193267Sjkim    return (AE_OK);
117193267Sjkim}
118193267Sjkim
119193267Sjkim
120193267SjkimACPI_STATUS
121213800SjkimAcpiOsTerminate (
122213800Sjkim    void)
123193267Sjkim{
124193267Sjkim
125193267Sjkim    return (AE_OK);
126193267Sjkim}
127193267Sjkim
128193267Sjkim
129193267Sjkim/******************************************************************************
130193267Sjkim *
131193267Sjkim * FUNCTION:    AcpiOsGetRootPointer
132193267Sjkim *
133193267Sjkim * PARAMETERS:  None
134193267Sjkim *
135193267Sjkim * RETURN:      RSDP physical address
136193267Sjkim *
137213800Sjkim * DESCRIPTION: Gets the ACPI root pointer (RSDP)
138193267Sjkim *
139193267Sjkim *****************************************************************************/
140193267Sjkim
141193267SjkimACPI_PHYSICAL_ADDRESS
142193267SjkimAcpiOsGetRootPointer (
143193267Sjkim    void)
144193267Sjkim{
145193267Sjkim
146193267Sjkim    return (AeLocalGetRootPointer ());
147193267Sjkim}
148193267Sjkim
149193267Sjkim
150193267Sjkim/******************************************************************************
151193267Sjkim *
152193267Sjkim * FUNCTION:    AcpiOsPredefinedOverride
153193267Sjkim *
154213800Sjkim * PARAMETERS:  InitVal             - Initial value of the predefined object
155213800Sjkim *              NewVal              - The new value for the object
156193267Sjkim *
157213800Sjkim * RETURN:      Status, pointer to value. Null pointer returned if not
158193267Sjkim *              overriding.
159193267Sjkim *
160193267Sjkim * DESCRIPTION: Allow the OS to override predefined names
161193267Sjkim *
162193267Sjkim *****************************************************************************/
163193267Sjkim
164193267SjkimACPI_STATUS
165193267SjkimAcpiOsPredefinedOverride (
166193267Sjkim    const ACPI_PREDEFINED_NAMES *InitVal,
167193267Sjkim    ACPI_STRING                 *NewVal)
168193267Sjkim{
169193267Sjkim
170193267Sjkim    if (!InitVal || !NewVal)
171193267Sjkim    {
172193267Sjkim        return (AE_BAD_PARAMETER);
173193267Sjkim    }
174193267Sjkim
175193267Sjkim    *NewVal = NULL;
176193267Sjkim    return (AE_OK);
177193267Sjkim}
178193267Sjkim
179193267Sjkim
180193267Sjkim/******************************************************************************
181193267Sjkim *
182193267Sjkim * FUNCTION:    AcpiOsTableOverride
183193267Sjkim *
184213800Sjkim * PARAMETERS:  ExistingTable       - Header of current table (probably
185213800Sjkim *                                    firmware)
186213800Sjkim *              NewTable            - Where an entire new table is returned.
187193267Sjkim *
188213800Sjkim * RETURN:      Status, pointer to new table. Null pointer returned if no
189193267Sjkim *              table is available to override
190193267Sjkim *
191193267Sjkim * DESCRIPTION: Return a different version of a table if one is available
192193267Sjkim *
193193267Sjkim *****************************************************************************/
194193267Sjkim
195193267SjkimACPI_STATUS
196193267SjkimAcpiOsTableOverride (
197193267Sjkim    ACPI_TABLE_HEADER       *ExistingTable,
198193267Sjkim    ACPI_TABLE_HEADER       **NewTable)
199193267Sjkim{
200193267Sjkim
201193267Sjkim    if (!ExistingTable || !NewTable)
202193267Sjkim    {
203193267Sjkim        return (AE_BAD_PARAMETER);
204193267Sjkim    }
205193267Sjkim
206193267Sjkim    *NewTable = NULL;
207193267Sjkim
208193267Sjkim#ifdef ACPI_EXEC_APP
209193267Sjkim
210193267Sjkim    AeTableOverride (ExistingTable, NewTable);
211193267Sjkim    return (AE_OK);
212193267Sjkim#else
213193267Sjkim
214193267Sjkim    return (AE_NO_ACPI_TABLES);
215193267Sjkim#endif
216193267Sjkim}
217193267Sjkim
218193267Sjkim
219193267Sjkim/******************************************************************************
220193267Sjkim *
221231844Sjkim * FUNCTION:    AcpiOsPhysicalTableOverride
222231844Sjkim *
223231844Sjkim * PARAMETERS:  ExistingTable       - Header of current table (probably firmware)
224231844Sjkim *              NewAddress          - Where new table address is returned
225231844Sjkim *                                    (Physical address)
226231844Sjkim *              NewTableLength      - Where new table length is returned
227231844Sjkim *
228231844Sjkim * RETURN:      Status, address/length of new table. Null pointer returned
229231844Sjkim *              if no table is available to override.
230231844Sjkim *
231231844Sjkim * DESCRIPTION: Returns AE_SUPPORT, function not used in user space.
232231844Sjkim *
233231844Sjkim *****************************************************************************/
234231844Sjkim
235231844SjkimACPI_STATUS
236231844SjkimAcpiOsPhysicalTableOverride (
237231844Sjkim    ACPI_TABLE_HEADER       *ExistingTable,
238231844Sjkim    ACPI_PHYSICAL_ADDRESS   *NewAddress,
239231844Sjkim    UINT32                  *NewTableLength)
240231844Sjkim{
241231844Sjkim
242231844Sjkim    return (AE_SUPPORT);
243231844Sjkim}
244231844Sjkim
245231844Sjkim
246231844Sjkim/******************************************************************************
247231844Sjkim *
248193267Sjkim * FUNCTION:    AcpiOsRedirectOutput
249193267Sjkim *
250193267Sjkim * PARAMETERS:  Destination         - An open file handle/pointer
251193267Sjkim *
252193267Sjkim * RETURN:      None
253193267Sjkim *
254193267Sjkim * DESCRIPTION: Causes redirect of AcpiOsPrintf and AcpiOsVprintf
255193267Sjkim *
256193267Sjkim *****************************************************************************/
257193267Sjkim
258193267Sjkimvoid
259193267SjkimAcpiOsRedirectOutput (
260193267Sjkim    void                    *Destination)
261193267Sjkim{
262193267Sjkim
263193267Sjkim    AcpiGbl_OutputFile = Destination;
264193267Sjkim}
265193267Sjkim
266193267Sjkim
267193267Sjkim/******************************************************************************
268193267Sjkim *
269193267Sjkim * FUNCTION:    AcpiOsPrintf
270193267Sjkim *
271213800Sjkim * PARAMETERS:  fmt, ...            - Standard printf format
272193267Sjkim *
273193267Sjkim * RETURN:      None
274193267Sjkim *
275245582Sjkim * DESCRIPTION: Formatted output. Note: very similar to AcpiOsVprintf
276245582Sjkim *              (performance), changes should be tracked in both functions.
277193267Sjkim *
278193267Sjkim *****************************************************************************/
279193267Sjkim
280193267Sjkimvoid ACPI_INTERNAL_VAR_XFACE
281193267SjkimAcpiOsPrintf (
282193267Sjkim    const char              *Fmt,
283193267Sjkim    ...)
284193267Sjkim{
285193267Sjkim    va_list                 Args;
286245582Sjkim    UINT8                   Flags;
287193267Sjkim
288193267Sjkim
289245582Sjkim    Flags = AcpiGbl_DbOutputFlags;
290245582Sjkim    if (Flags & ACPI_DB_REDIRECTABLE_OUTPUT)
291245582Sjkim    {
292245582Sjkim        /* Output is directable to either a file (if open) or the console */
293245582Sjkim
294245582Sjkim        if (AcpiGbl_DebugFile)
295245582Sjkim        {
296245582Sjkim            /* Output file is open, send the output there */
297245582Sjkim
298245582Sjkim            va_start (Args, Fmt);
299245582Sjkim            vfprintf (AcpiGbl_DebugFile, Fmt, Args);
300245582Sjkim            va_end (Args);
301245582Sjkim        }
302245582Sjkim        else
303245582Sjkim        {
304245582Sjkim            /* No redirection, send output to console (once only!) */
305245582Sjkim
306245582Sjkim            Flags |= ACPI_DB_CONSOLE_OUTPUT;
307245582Sjkim        }
308245582Sjkim    }
309245582Sjkim
310245582Sjkim    if (Flags & ACPI_DB_CONSOLE_OUTPUT)
311245582Sjkim    {
312245582Sjkim        va_start (Args, Fmt);
313245582Sjkim        vfprintf (AcpiGbl_OutputFile, Fmt, Args);
314245582Sjkim        va_end (Args);
315245582Sjkim    }
316193267Sjkim}
317193267Sjkim
318193267Sjkim
319193267Sjkim/******************************************************************************
320193267Sjkim *
321193267Sjkim * FUNCTION:    AcpiOsVprintf
322193267Sjkim *
323213800Sjkim * PARAMETERS:  fmt                 - Standard printf format
324213800Sjkim *              args                - Argument list
325193267Sjkim *
326193267Sjkim * RETURN:      None
327193267Sjkim *
328245582Sjkim * DESCRIPTION: Formatted output with argument list pointer. Note: very
329245582Sjkim *              similar to AcpiOsPrintf, changes should be tracked in both
330245582Sjkim *              functions.
331193267Sjkim *
332193267Sjkim *****************************************************************************/
333193267Sjkim
334193267Sjkimvoid
335193267SjkimAcpiOsVprintf (
336193267Sjkim    const char              *Fmt,
337193267Sjkim    va_list                 Args)
338193267Sjkim{
339193267Sjkim    UINT8                   Flags;
340245582Sjkim    char                    Buffer[ACPI_VPRINTF_BUFFER_SIZE];
341193267Sjkim
342193267Sjkim
343245582Sjkim    /*
344245582Sjkim     * We build the output string in a local buffer because we may be
345245582Sjkim     * outputting the buffer twice. Using vfprintf is problematic because
346245582Sjkim     * some implementations modify the args pointer/structure during
347245582Sjkim     * execution. Thus, we use the local buffer for portability.
348245582Sjkim     *
349245582Sjkim     * Note: Since this module is intended for use by the various ACPICA
350245582Sjkim     * utilities/applications, we can safely declare the buffer on the stack.
351245582Sjkim     * Also, This function is used for relatively small error messages only.
352245582Sjkim     */
353245582Sjkim    vsnprintf (Buffer, ACPI_VPRINTF_BUFFER_SIZE, Fmt, Args);
354245582Sjkim
355193267Sjkim    Flags = AcpiGbl_DbOutputFlags;
356193267Sjkim    if (Flags & ACPI_DB_REDIRECTABLE_OUTPUT)
357193267Sjkim    {
358193267Sjkim        /* Output is directable to either a file (if open) or the console */
359193267Sjkim
360193267Sjkim        if (AcpiGbl_DebugFile)
361193267Sjkim        {
362193267Sjkim            /* Output file is open, send the output there */
363193267Sjkim
364245582Sjkim            fputs (Buffer, AcpiGbl_DebugFile);
365193267Sjkim        }
366193267Sjkim        else
367193267Sjkim        {
368193267Sjkim            /* No redirection, send output to console (once only!) */
369193267Sjkim
370193267Sjkim            Flags |= ACPI_DB_CONSOLE_OUTPUT;
371193267Sjkim        }
372193267Sjkim    }
373193267Sjkim
374193267Sjkim    if (Flags & ACPI_DB_CONSOLE_OUTPUT)
375193267Sjkim    {
376245582Sjkim        fputs (Buffer, AcpiGbl_OutputFile);
377193267Sjkim    }
378193267Sjkim}
379193267Sjkim
380193267Sjkim
381193267Sjkim/******************************************************************************
382193267Sjkim *
383193267Sjkim * FUNCTION:    AcpiOsGetLine
384193267Sjkim *
385222538Sjkim * PARAMETERS:  Buffer              - Where to return the command line
386222538Sjkim *              BufferLength        - Maximum length of Buffer
387222538Sjkim *              BytesRead           - Where the actual byte count is returned
388193267Sjkim *
389222538Sjkim * RETURN:      Status and actual bytes read
390193267Sjkim *
391193267Sjkim * DESCRIPTION: Formatted input with argument list pointer
392193267Sjkim *
393193267Sjkim *****************************************************************************/
394193267Sjkim
395222538SjkimACPI_STATUS
396193267SjkimAcpiOsGetLine (
397222538Sjkim    char                    *Buffer,
398222538Sjkim    UINT32                  BufferLength,
399222538Sjkim    UINT32                  *BytesRead)
400193267Sjkim{
401239340Sjkim    int                     Temp;
402193267Sjkim    UINT32                  i;
403193267Sjkim
404193267Sjkim
405193267Sjkim    for (i = 0; ; i++)
406193267Sjkim    {
407222538Sjkim        if (i >= BufferLength)
408222538Sjkim        {
409222538Sjkim            return (AE_BUFFER_OVERFLOW);
410222538Sjkim        }
411222538Sjkim
412239340Sjkim        if ((Temp = getchar ()) == EOF)
413239340Sjkim        {
414239340Sjkim            return (AE_ERROR);
415239340Sjkim        }
416239340Sjkim
417193267Sjkim        if (!Temp || Temp == '\n')
418193267Sjkim        {
419193267Sjkim            break;
420193267Sjkim        }
421193267Sjkim
422239340Sjkim        Buffer [i] = (char) Temp;
423193267Sjkim    }
424193267Sjkim
425193267Sjkim    /* Null terminate the buffer */
426193267Sjkim
427193267Sjkim    Buffer [i] = 0;
428193267Sjkim
429193267Sjkim    /* Return the number of bytes in the string */
430193267Sjkim
431222538Sjkim    if (BytesRead)
432222538Sjkim    {
433222538Sjkim        *BytesRead = i;
434222538Sjkim    }
435222538Sjkim    return (AE_OK);
436193267Sjkim}
437193267Sjkim
438213800Sjkim
439193267Sjkim/******************************************************************************
440193267Sjkim *
441193267Sjkim * FUNCTION:    AcpiOsMapMemory
442193267Sjkim *
443213800Sjkim * PARAMETERS:  where               - Physical address of memory to be mapped
444213800Sjkim *              length              - How much memory to map
445193267Sjkim *
446213800Sjkim * RETURN:      Pointer to mapped memory. Null on error.
447193267Sjkim *
448193267Sjkim * DESCRIPTION: Map physical memory into caller's address space
449193267Sjkim *
450193267Sjkim *****************************************************************************/
451193267Sjkim
452193267Sjkimvoid *
453193267SjkimAcpiOsMapMemory (
454193267Sjkim    ACPI_PHYSICAL_ADDRESS   where,
455193267Sjkim    ACPI_SIZE               length)
456193267Sjkim{
457193267Sjkim
458193267Sjkim    return (ACPI_TO_POINTER ((ACPI_SIZE) where));
459193267Sjkim}
460193267Sjkim
461193267Sjkim
462193267Sjkim/******************************************************************************
463193267Sjkim *
464193267Sjkim * FUNCTION:    AcpiOsUnmapMemory
465193267Sjkim *
466213800Sjkim * PARAMETERS:  where               - Logical address of memory to be unmapped
467213800Sjkim *              length              - How much memory to unmap
468193267Sjkim *
469193267Sjkim * RETURN:      None.
470193267Sjkim *
471213800Sjkim * DESCRIPTION: Delete a previously created mapping. Where and Length must
472193267Sjkim *              correspond to a previous mapping exactly.
473193267Sjkim *
474193267Sjkim *****************************************************************************/
475193267Sjkim
476193267Sjkimvoid
477193267SjkimAcpiOsUnmapMemory (
478193267Sjkim    void                    *where,
479193267Sjkim    ACPI_SIZE               length)
480193267Sjkim{
481193267Sjkim
482193267Sjkim    return;
483193267Sjkim}
484193267Sjkim
485193267Sjkim
486193267Sjkim/******************************************************************************
487193267Sjkim *
488193267Sjkim * FUNCTION:    AcpiOsAllocate
489193267Sjkim *
490213800Sjkim * PARAMETERS:  Size                - Amount to allocate, in bytes
491193267Sjkim *
492213800Sjkim * RETURN:      Pointer to the new allocation. Null on error.
493193267Sjkim *
494213800Sjkim * DESCRIPTION: Allocate memory. Algorithm is dependent on the OS.
495193267Sjkim *
496193267Sjkim *****************************************************************************/
497193267Sjkim
498193267Sjkimvoid *
499193267SjkimAcpiOsAllocate (
500193267Sjkim    ACPI_SIZE               size)
501193267Sjkim{
502193267Sjkim    void                    *Mem;
503193267Sjkim
504193267Sjkim
505193267Sjkim    Mem = (void *) malloc ((size_t) size);
506193267Sjkim    return (Mem);
507193267Sjkim}
508193267Sjkim
509193267Sjkim
510193267Sjkim/******************************************************************************
511193267Sjkim *
512193267Sjkim * FUNCTION:    AcpiOsFree
513193267Sjkim *
514213800Sjkim * PARAMETERS:  mem                 - Pointer to previously allocated memory
515193267Sjkim *
516193267Sjkim * RETURN:      None.
517193267Sjkim *
518193267Sjkim * DESCRIPTION: Free memory allocated via AcpiOsAllocate
519193267Sjkim *
520193267Sjkim *****************************************************************************/
521193267Sjkim
522193267Sjkimvoid
523193267SjkimAcpiOsFree (
524193267Sjkim    void                    *mem)
525193267Sjkim{
526193267Sjkim
527193267Sjkim    free (mem);
528193267Sjkim}
529193267Sjkim
530193267Sjkim
531213800Sjkim#ifdef ACPI_SINGLE_THREADED
532193267Sjkim/******************************************************************************
533193267Sjkim *
534213800Sjkim * FUNCTION:    Semaphore stub functions
535213800Sjkim *
536213800Sjkim * DESCRIPTION: Stub functions used for single-thread applications that do
537213800Sjkim *              not require semaphore synchronization. Full implementations
538213800Sjkim *              of these functions appear after the stubs.
539213800Sjkim *
540213800Sjkim *****************************************************************************/
541213800Sjkim
542213800SjkimACPI_STATUS
543213800SjkimAcpiOsCreateSemaphore (
544213800Sjkim    UINT32              MaxUnits,
545213800Sjkim    UINT32              InitialUnits,
546213800Sjkim    ACPI_HANDLE         *OutHandle)
547213800Sjkim{
548213800Sjkim    *OutHandle = (ACPI_HANDLE) 1;
549213800Sjkim    return (AE_OK);
550213800Sjkim}
551213800Sjkim
552213800SjkimACPI_STATUS
553213800SjkimAcpiOsDeleteSemaphore (
554213800Sjkim    ACPI_HANDLE         Handle)
555213800Sjkim{
556213800Sjkim    return (AE_OK);
557213800Sjkim}
558213800Sjkim
559213800SjkimACPI_STATUS
560213800SjkimAcpiOsWaitSemaphore (
561213800Sjkim    ACPI_HANDLE         Handle,
562213800Sjkim    UINT32              Units,
563213800Sjkim    UINT16              Timeout)
564213800Sjkim{
565213800Sjkim    return (AE_OK);
566213800Sjkim}
567213800Sjkim
568213800SjkimACPI_STATUS
569213800SjkimAcpiOsSignalSemaphore (
570213800Sjkim    ACPI_HANDLE         Handle,
571213800Sjkim    UINT32              Units)
572213800Sjkim{
573213800Sjkim    return (AE_OK);
574213800Sjkim}
575213800Sjkim
576213800Sjkim#else
577213800Sjkim/******************************************************************************
578213800Sjkim *
579193267Sjkim * FUNCTION:    AcpiOsCreateSemaphore
580193267Sjkim *
581193267Sjkim * PARAMETERS:  InitialUnits        - Units to be assigned to the new semaphore
582193267Sjkim *              OutHandle           - Where a handle will be returned
583193267Sjkim *
584193267Sjkim * RETURN:      Status
585193267Sjkim *
586193267Sjkim * DESCRIPTION: Create an OS semaphore
587193267Sjkim *
588193267Sjkim *****************************************************************************/
589193267Sjkim
590193267SjkimACPI_STATUS
591193267SjkimAcpiOsCreateSemaphore (
592193267Sjkim    UINT32              MaxUnits,
593193267Sjkim    UINT32              InitialUnits,
594193267Sjkim    ACPI_HANDLE         *OutHandle)
595193267Sjkim{
596193267Sjkim    sem_t               *Sem;
597193267Sjkim
598193267Sjkim
599193267Sjkim    if (!OutHandle)
600193267Sjkim    {
601193267Sjkim        return (AE_BAD_PARAMETER);
602193267Sjkim    }
603193267Sjkim
604209734Sjkim#ifdef __APPLE__
605209734Sjkim    {
606213800Sjkim        char            *SemaphoreName = tmpnam (NULL);
607213800Sjkim
608213800Sjkim        Sem = sem_open (SemaphoreName, O_EXCL|O_CREAT, 0755, InitialUnits);
609213800Sjkim        if (!Sem)
610213800Sjkim        {
611213800Sjkim            return (AE_NO_MEMORY);
612213800Sjkim        }
613213800Sjkim        sem_unlink (SemaphoreName); /* This just deletes the name */
614209734Sjkim    }
615209734Sjkim
616209734Sjkim#else
617193267Sjkim    Sem = AcpiOsAllocate (sizeof (sem_t));
618193267Sjkim    if (!Sem)
619193267Sjkim    {
620193267Sjkim        return (AE_NO_MEMORY);
621193267Sjkim    }
622193267Sjkim
623193267Sjkim    if (sem_init (Sem, 0, InitialUnits) == -1)
624193267Sjkim    {
625193267Sjkim        AcpiOsFree (Sem);
626193267Sjkim        return (AE_BAD_PARAMETER);
627193267Sjkim    }
628209734Sjkim#endif
629193267Sjkim
630193267Sjkim    *OutHandle = (ACPI_HANDLE) Sem;
631193267Sjkim    return (AE_OK);
632193267Sjkim}
633193267Sjkim
634193267Sjkim
635193267Sjkim/******************************************************************************
636193267Sjkim *
637193267Sjkim * FUNCTION:    AcpiOsDeleteSemaphore
638193267Sjkim *
639193267Sjkim * PARAMETERS:  Handle              - Handle returned by AcpiOsCreateSemaphore
640193267Sjkim *
641193267Sjkim * RETURN:      Status
642193267Sjkim *
643193267Sjkim * DESCRIPTION: Delete an OS semaphore
644193267Sjkim *
645193267Sjkim *****************************************************************************/
646193267Sjkim
647193267SjkimACPI_STATUS
648193267SjkimAcpiOsDeleteSemaphore (
649193267Sjkim    ACPI_HANDLE         Handle)
650193267Sjkim{
651193267Sjkim    sem_t               *Sem = (sem_t *) Handle;
652193267Sjkim
653193267Sjkim
654193267Sjkim    if (!Sem)
655193267Sjkim    {
656193267Sjkim        return (AE_BAD_PARAMETER);
657193267Sjkim    }
658193267Sjkim
659193267Sjkim    if (sem_destroy (Sem) == -1)
660193267Sjkim    {
661193267Sjkim        return (AE_BAD_PARAMETER);
662193267Sjkim    }
663193267Sjkim
664193267Sjkim    return (AE_OK);
665193267Sjkim}
666193267Sjkim
667193267Sjkim
668193267Sjkim/******************************************************************************
669193267Sjkim *
670193267Sjkim * FUNCTION:    AcpiOsWaitSemaphore
671193267Sjkim *
672193267Sjkim * PARAMETERS:  Handle              - Handle returned by AcpiOsCreateSemaphore
673193267Sjkim *              Units               - How many units to wait for
674245582Sjkim *              MsecTimeout         - How long to wait (milliseconds)
675193267Sjkim *
676193267Sjkim * RETURN:      Status
677193267Sjkim *
678193267Sjkim * DESCRIPTION: Wait for units
679193267Sjkim *
680193267Sjkim *****************************************************************************/
681193267Sjkim
682193267SjkimACPI_STATUS
683193267SjkimAcpiOsWaitSemaphore (
684193267Sjkim    ACPI_HANDLE         Handle,
685193267Sjkim    UINT32              Units,
686245582Sjkim    UINT16              MsecTimeout)
687193267Sjkim{
688193267Sjkim    ACPI_STATUS         Status = AE_OK;
689193267Sjkim    sem_t               *Sem = (sem_t *) Handle;
690245582Sjkim#ifndef ACPI_USE_ALTERNATE_TIMEOUT
691245582Sjkim    struct timespec     Time;
692245582Sjkim    int                 RetVal;
693245582Sjkim#endif
694193267Sjkim
695193267Sjkim
696193267Sjkim    if (!Sem)
697193267Sjkim    {
698193267Sjkim        return (AE_BAD_PARAMETER);
699193267Sjkim    }
700193267Sjkim
701245582Sjkim    switch (MsecTimeout)
702193267Sjkim    {
703193267Sjkim    /*
704193267Sjkim     * No Wait:
705193267Sjkim     * --------
706193267Sjkim     * A zero timeout value indicates that we shouldn't wait - just
707193267Sjkim     * acquire the semaphore if available otherwise return AE_TIME
708193267Sjkim     * (a.k.a. 'would block').
709193267Sjkim     */
710193267Sjkim    case 0:
711193267Sjkim
712193267Sjkim        if (sem_trywait(Sem) == -1)
713193267Sjkim        {
714193267Sjkim            Status = (AE_TIME);
715193267Sjkim        }
716193267Sjkim        break;
717193267Sjkim
718193267Sjkim    /* Wait Indefinitely */
719193267Sjkim
720193267Sjkim    case ACPI_WAIT_FOREVER:
721193267Sjkim
722193267Sjkim        if (sem_wait (Sem))
723193267Sjkim        {
724193267Sjkim            Status = (AE_TIME);
725193267Sjkim        }
726193267Sjkim        break;
727193267Sjkim
728245582Sjkim    /* Wait with MsecTimeout */
729193267Sjkim
730193267Sjkim    default:
731193267Sjkim
732193267Sjkim#ifdef ACPI_USE_ALTERNATE_TIMEOUT
733193267Sjkim        /*
734193267Sjkim         * Alternate timeout mechanism for environments where
735193267Sjkim         * sem_timedwait is not available or does not work properly.
736193267Sjkim         */
737245582Sjkim        while (MsecTimeout)
738193267Sjkim        {
739193267Sjkim            if (sem_trywait (Sem) == 0)
740193267Sjkim            {
741193267Sjkim                /* Got the semaphore */
742193267Sjkim                return (AE_OK);
743193267Sjkim            }
744245582Sjkim
745245582Sjkim            if (MsecTimeout >= 10)
746245582Sjkim            {
747245582Sjkim                MsecTimeout -= 10;
748245582Sjkim                usleep (10 * ACPI_USEC_PER_MSEC); /* ten milliseconds */
749245582Sjkim            }
750245582Sjkim            else
751245582Sjkim            {
752245582Sjkim                MsecTimeout--;
753245582Sjkim                usleep (ACPI_USEC_PER_MSEC); /* one millisecond */
754245582Sjkim            }
755193267Sjkim        }
756193267Sjkim        Status = (AE_TIME);
757193267Sjkim#else
758245582Sjkim        /*
759245582Sjkim         * The interface to sem_timedwait is an absolute time, so we need to
760245582Sjkim         * get the current time, then add in the millisecond Timeout value.
761245582Sjkim         */
762245582Sjkim        if (clock_gettime (CLOCK_REALTIME, &Time) == -1)
763245582Sjkim        {
764245582Sjkim            perror ("clock_gettime");
765245582Sjkim            return (AE_TIME);
766245582Sjkim        }
767193267Sjkim
768245582Sjkim        Time.tv_sec += (MsecTimeout / ACPI_MSEC_PER_SEC);
769245582Sjkim        Time.tv_nsec += ((MsecTimeout % ACPI_MSEC_PER_SEC) * ACPI_NSEC_PER_MSEC);
770245582Sjkim
771245582Sjkim        /* Handle nanosecond overflow (field must be less than one second) */
772245582Sjkim
773245582Sjkim        if (Time.tv_nsec >= ACPI_NSEC_PER_SEC)
774193267Sjkim        {
775245582Sjkim            Time.tv_sec += (Time.tv_nsec / ACPI_NSEC_PER_SEC);
776245582Sjkim            Time.tv_nsec = (Time.tv_nsec % ACPI_NSEC_PER_SEC);
777245582Sjkim        }
778245582Sjkim
779245582Sjkim        while (((RetVal = sem_timedwait (Sem, &Time)) == -1) && (errno == EINTR))
780245582Sjkim        {
781245582Sjkim            continue;
782245582Sjkim        }
783245582Sjkim
784245582Sjkim        if (RetVal != 0)
785245582Sjkim        {
786245582Sjkim            if (errno != ETIMEDOUT)
787245582Sjkim            {
788245582Sjkim                perror ("sem_timedwait");
789245582Sjkim            }
790193267Sjkim            Status = (AE_TIME);
791193267Sjkim        }
792193267Sjkim#endif
793193267Sjkim        break;
794193267Sjkim    }
795193267Sjkim
796193267Sjkim    return (Status);
797193267Sjkim}
798193267Sjkim
799193267Sjkim
800193267Sjkim/******************************************************************************
801193267Sjkim *
802193267Sjkim * FUNCTION:    AcpiOsSignalSemaphore
803193267Sjkim *
804193267Sjkim * PARAMETERS:  Handle              - Handle returned by AcpiOsCreateSemaphore
805193267Sjkim *              Units               - Number of units to send
806193267Sjkim *
807193267Sjkim * RETURN:      Status
808193267Sjkim *
809193267Sjkim * DESCRIPTION: Send units
810193267Sjkim *
811193267Sjkim *****************************************************************************/
812193267Sjkim
813193267SjkimACPI_STATUS
814193267SjkimAcpiOsSignalSemaphore (
815193267Sjkim    ACPI_HANDLE         Handle,
816193267Sjkim    UINT32              Units)
817193267Sjkim{
818193267Sjkim    sem_t               *Sem = (sem_t *)Handle;
819193267Sjkim
820193267Sjkim
821193267Sjkim    if (!Sem)
822193267Sjkim    {
823193267Sjkim        return (AE_BAD_PARAMETER);
824193267Sjkim    }
825193267Sjkim
826193267Sjkim    if (sem_post (Sem) == -1)
827193267Sjkim    {
828193267Sjkim        return (AE_LIMIT);
829193267Sjkim    }
830193267Sjkim
831193267Sjkim    return (AE_OK);
832193267Sjkim}
833193267Sjkim
834213800Sjkim#endif /* ACPI_SINGLE_THREADED */
835193267Sjkim
836213800Sjkim
837193267Sjkim/******************************************************************************
838193267Sjkim *
839193267Sjkim * FUNCTION:    Spinlock interfaces
840193267Sjkim *
841193267Sjkim * DESCRIPTION: Map these interfaces to semaphore interfaces
842193267Sjkim *
843193267Sjkim *****************************************************************************/
844193267Sjkim
845193267SjkimACPI_STATUS
846193267SjkimAcpiOsCreateLock (
847193267Sjkim    ACPI_SPINLOCK           *OutHandle)
848193267Sjkim{
849193267Sjkim
850193267Sjkim    return (AcpiOsCreateSemaphore (1, 1, OutHandle));
851193267Sjkim}
852193267Sjkim
853193267Sjkim
854193267Sjkimvoid
855193267SjkimAcpiOsDeleteLock (
856193267Sjkim    ACPI_SPINLOCK           Handle)
857193267Sjkim{
858193267Sjkim    AcpiOsDeleteSemaphore (Handle);
859193267Sjkim}
860193267Sjkim
861193267Sjkim
862193267SjkimACPI_CPU_FLAGS
863193267SjkimAcpiOsAcquireLock (
864193267Sjkim    ACPI_HANDLE             Handle)
865193267Sjkim{
866193267Sjkim    AcpiOsWaitSemaphore (Handle, 1, 0xFFFF);
867193267Sjkim    return (0);
868193267Sjkim}
869193267Sjkim
870193267Sjkim
871193267Sjkimvoid
872193267SjkimAcpiOsReleaseLock (
873193267Sjkim    ACPI_SPINLOCK           Handle,
874193267Sjkim    ACPI_CPU_FLAGS          Flags)
875193267Sjkim{
876193267Sjkim    AcpiOsSignalSemaphore (Handle, 1);
877193267Sjkim}
878193267Sjkim
879193267Sjkim
880193267Sjkim/******************************************************************************
881193267Sjkim *
882193267Sjkim * FUNCTION:    AcpiOsInstallInterruptHandler
883193267Sjkim *
884213800Sjkim * PARAMETERS:  InterruptNumber     - Level handler should respond to.
885213800Sjkim *              Isr                 - Address of the ACPI interrupt handler
886213800Sjkim *              ExceptPtr           - Where status is returned
887193267Sjkim *
888193267Sjkim * RETURN:      Handle to the newly installed handler.
889193267Sjkim *
890213800Sjkim * DESCRIPTION: Install an interrupt handler. Used to install the ACPI
891193267Sjkim *              OS-independent handler.
892193267Sjkim *
893193267Sjkim *****************************************************************************/
894193267Sjkim
895193267SjkimUINT32
896193267SjkimAcpiOsInstallInterruptHandler (
897193267Sjkim    UINT32                  InterruptNumber,
898193267Sjkim    ACPI_OSD_HANDLER        ServiceRoutine,
899193267Sjkim    void                    *Context)
900193267Sjkim{
901193267Sjkim
902193267Sjkim    return (AE_OK);
903193267Sjkim}
904193267Sjkim
905193267Sjkim
906193267Sjkim/******************************************************************************
907193267Sjkim *
908193267Sjkim * FUNCTION:    AcpiOsRemoveInterruptHandler
909193267Sjkim *
910213800Sjkim * PARAMETERS:  Handle              - Returned when handler was installed
911193267Sjkim *
912193267Sjkim * RETURN:      Status
913193267Sjkim *
914193267Sjkim * DESCRIPTION: Uninstalls an interrupt handler.
915193267Sjkim *
916193267Sjkim *****************************************************************************/
917193267Sjkim
918193267SjkimACPI_STATUS
919193267SjkimAcpiOsRemoveInterruptHandler (
920193267Sjkim    UINT32                  InterruptNumber,
921193267Sjkim    ACPI_OSD_HANDLER        ServiceRoutine)
922193267Sjkim{
923193267Sjkim
924193267Sjkim    return (AE_OK);
925193267Sjkim}
926193267Sjkim
927193267Sjkim
928193267Sjkim/******************************************************************************
929193267Sjkim *
930193267Sjkim * FUNCTION:    AcpiOsStall
931193267Sjkim *
932213800Sjkim * PARAMETERS:  microseconds        - Time to sleep
933193267Sjkim *
934193267Sjkim * RETURN:      Blocks until sleep is completed.
935193267Sjkim *
936193267Sjkim * DESCRIPTION: Sleep at microsecond granularity
937193267Sjkim *
938193267Sjkim *****************************************************************************/
939193267Sjkim
940193267Sjkimvoid
941193267SjkimAcpiOsStall (
942193267Sjkim    UINT32                  microseconds)
943193267Sjkim{
944193267Sjkim
945193267Sjkim    if (microseconds)
946193267Sjkim    {
947193267Sjkim        usleep (microseconds);
948193267Sjkim    }
949193267Sjkim}
950193267Sjkim
951193267Sjkim
952193267Sjkim/******************************************************************************
953193267Sjkim *
954193267Sjkim * FUNCTION:    AcpiOsSleep
955193267Sjkim *
956213800Sjkim * PARAMETERS:  milliseconds        - Time to sleep
957193267Sjkim *
958193267Sjkim * RETURN:      Blocks until sleep is completed.
959193267Sjkim *
960193267Sjkim * DESCRIPTION: Sleep at millisecond granularity
961193267Sjkim *
962193267Sjkim *****************************************************************************/
963193267Sjkim
964193267Sjkimvoid
965193267SjkimAcpiOsSleep (
966202766Sjkim    UINT64                  milliseconds)
967193267Sjkim{
968193267Sjkim
969245582Sjkim    /* Sleep for whole seconds */
970193267Sjkim
971245582Sjkim    sleep (milliseconds / ACPI_MSEC_PER_SEC);
972245582Sjkim
973193267Sjkim    /*
974245582Sjkim     * Sleep for remaining microseconds.
975245582Sjkim     * Arg to usleep() is in usecs and must be less than 1,000,000 (1 second).
976193267Sjkim     */
977245582Sjkim    usleep ((milliseconds % ACPI_MSEC_PER_SEC) * ACPI_USEC_PER_MSEC);
978193267Sjkim}
979193267Sjkim
980213800Sjkim
981193267Sjkim/******************************************************************************
982193267Sjkim *
983193267Sjkim * FUNCTION:    AcpiOsGetTimer
984193267Sjkim *
985193267Sjkim * PARAMETERS:  None
986193267Sjkim *
987193267Sjkim * RETURN:      Current time in 100 nanosecond units
988193267Sjkim *
989193267Sjkim * DESCRIPTION: Get the current system time
990193267Sjkim *
991193267Sjkim *****************************************************************************/
992193267Sjkim
993193267SjkimUINT64
994213800SjkimAcpiOsGetTimer (
995213800Sjkim    void)
996193267Sjkim{
997193267Sjkim    struct timeval          time;
998193267Sjkim
999193267Sjkim
1000245582Sjkim    /* This timer has sufficient resolution for user-space application code */
1001245582Sjkim
1002193267Sjkim    gettimeofday (&time, NULL);
1003193267Sjkim
1004245582Sjkim    /* (Seconds * 10^7 = 100ns(10^-7)) + (Microseconds(10^-6) * 10^1 = 100ns) */
1005193267Sjkim
1006245582Sjkim    return (((UINT64) time.tv_sec * ACPI_100NSEC_PER_SEC) +
1007245582Sjkim            ((UINT64) time.tv_usec * ACPI_100NSEC_PER_USEC));
1008193267Sjkim}
1009193267Sjkim
1010193267Sjkim
1011193267Sjkim/******************************************************************************
1012193267Sjkim *
1013193267Sjkim * FUNCTION:    AcpiOsReadPciConfiguration
1014193267Sjkim *
1015213800Sjkim * PARAMETERS:  PciId               - Seg/Bus/Dev
1016213800Sjkim *              Register            - Device Register
1017213800Sjkim *              Value               - Buffer where value is placed
1018213800Sjkim *              Width               - Number of bits
1019193267Sjkim *
1020193267Sjkim * RETURN:      Status
1021193267Sjkim *
1022193267Sjkim * DESCRIPTION: Read data from PCI configuration space
1023193267Sjkim *
1024193267Sjkim *****************************************************************************/
1025193267Sjkim
1026193267SjkimACPI_STATUS
1027193267SjkimAcpiOsReadPciConfiguration (
1028193267Sjkim    ACPI_PCI_ID             *PciId,
1029193267Sjkim    UINT32                  Register,
1030210944Sjkim    UINT64                  *Value,
1031193267Sjkim    UINT32                  Width)
1032193267Sjkim{
1033193267Sjkim
1034193267Sjkim    return (AE_OK);
1035193267Sjkim}
1036193267Sjkim
1037193267Sjkim
1038193267Sjkim/******************************************************************************
1039193267Sjkim *
1040193267Sjkim * FUNCTION:    AcpiOsWritePciConfiguration
1041193267Sjkim *
1042213800Sjkim * PARAMETERS:  PciId               - Seg/Bus/Dev
1043213800Sjkim *              Register            - Device Register
1044213800Sjkim *              Value               - Value to be written
1045213800Sjkim *              Width               - Number of bits
1046193267Sjkim *
1047193267Sjkim * RETURN:      Status.
1048193267Sjkim *
1049193267Sjkim * DESCRIPTION: Write data to PCI configuration space
1050193267Sjkim *
1051193267Sjkim *****************************************************************************/
1052193267Sjkim
1053193267SjkimACPI_STATUS
1054193267SjkimAcpiOsWritePciConfiguration (
1055193267Sjkim    ACPI_PCI_ID             *PciId,
1056193267Sjkim    UINT32                  Register,
1057202766Sjkim    UINT64                  Value,
1058193267Sjkim    UINT32                  Width)
1059193267Sjkim{
1060193267Sjkim
1061193267Sjkim    return (AE_OK);
1062193267Sjkim}
1063193267Sjkim
1064193267Sjkim
1065193267Sjkim/******************************************************************************
1066193267Sjkim *
1067193267Sjkim * FUNCTION:    AcpiOsReadPort
1068193267Sjkim *
1069213800Sjkim * PARAMETERS:  Address             - Address of I/O port/register to read
1070213800Sjkim *              Value               - Where value is placed
1071213800Sjkim *              Width               - Number of bits
1072193267Sjkim *
1073193267Sjkim * RETURN:      Value read from port
1074193267Sjkim *
1075193267Sjkim * DESCRIPTION: Read data from an I/O port or register
1076193267Sjkim *
1077193267Sjkim *****************************************************************************/
1078193267Sjkim
1079193267SjkimACPI_STATUS
1080193267SjkimAcpiOsReadPort (
1081193267Sjkim    ACPI_IO_ADDRESS         Address,
1082193267Sjkim    UINT32                  *Value,
1083193267Sjkim    UINT32                  Width)
1084193267Sjkim{
1085193267Sjkim
1086193267Sjkim    switch (Width)
1087193267Sjkim    {
1088193267Sjkim    case 8:
1089193267Sjkim        *Value = 0xFF;
1090193267Sjkim        break;
1091193267Sjkim
1092193267Sjkim    case 16:
1093193267Sjkim        *Value = 0xFFFF;
1094193267Sjkim        break;
1095193267Sjkim
1096193267Sjkim    case 32:
1097193267Sjkim        *Value = 0xFFFFFFFF;
1098193267Sjkim        break;
1099193267Sjkim
1100193267Sjkim    default:
1101193267Sjkim        return (AE_BAD_PARAMETER);
1102193267Sjkim    }
1103193267Sjkim
1104193267Sjkim    return (AE_OK);
1105193267Sjkim}
1106193267Sjkim
1107193267Sjkim
1108193267Sjkim/******************************************************************************
1109193267Sjkim *
1110193267Sjkim * FUNCTION:    AcpiOsWritePort
1111193267Sjkim *
1112213800Sjkim * PARAMETERS:  Address             - Address of I/O port/register to write
1113213800Sjkim *              Value               - Value to write
1114213800Sjkim *              Width               - Number of bits
1115193267Sjkim *
1116193267Sjkim * RETURN:      None
1117193267Sjkim *
1118193267Sjkim * DESCRIPTION: Write data to an I/O port or register
1119193267Sjkim *
1120193267Sjkim *****************************************************************************/
1121193267Sjkim
1122193267SjkimACPI_STATUS
1123193267SjkimAcpiOsWritePort (
1124193267Sjkim    ACPI_IO_ADDRESS         Address,
1125193267Sjkim    UINT32                  Value,
1126193267Sjkim    UINT32                  Width)
1127193267Sjkim{
1128193267Sjkim
1129193267Sjkim    return (AE_OK);
1130193267Sjkim}
1131193267Sjkim
1132193267Sjkim
1133193267Sjkim/******************************************************************************
1134193267Sjkim *
1135193267Sjkim * FUNCTION:    AcpiOsReadMemory
1136193267Sjkim *
1137213800Sjkim * PARAMETERS:  Address             - Physical Memory Address to read
1138213800Sjkim *              Value               - Where value is placed
1139231844Sjkim *              Width               - Number of bits (8,16,32, or 64)
1140193267Sjkim *
1141231844Sjkim * RETURN:      Value read from physical memory address. Always returned
1142231844Sjkim *              as a 64-bit integer, regardless of the read width.
1143193267Sjkim *
1144193267Sjkim * DESCRIPTION: Read data from a physical memory address
1145193267Sjkim *
1146193267Sjkim *****************************************************************************/
1147193267Sjkim
1148193267SjkimACPI_STATUS
1149193267SjkimAcpiOsReadMemory (
1150193267Sjkim    ACPI_PHYSICAL_ADDRESS   Address,
1151231844Sjkim    UINT64                  *Value,
1152193267Sjkim    UINT32                  Width)
1153193267Sjkim{
1154193267Sjkim
1155193267Sjkim    switch (Width)
1156193267Sjkim    {
1157193267Sjkim    case 8:
1158193267Sjkim    case 16:
1159193267Sjkim    case 32:
1160231844Sjkim    case 64:
1161193267Sjkim        *Value = 0;
1162193267Sjkim        break;
1163193267Sjkim
1164193267Sjkim    default:
1165193267Sjkim        return (AE_BAD_PARAMETER);
1166193267Sjkim    }
1167193267Sjkim    return (AE_OK);
1168193267Sjkim}
1169193267Sjkim
1170193267Sjkim
1171193267Sjkim/******************************************************************************
1172193267Sjkim *
1173193267Sjkim * FUNCTION:    AcpiOsWriteMemory
1174193267Sjkim *
1175213800Sjkim * PARAMETERS:  Address             - Physical Memory Address to write
1176213800Sjkim *              Value               - Value to write
1177231844Sjkim *              Width               - Number of bits (8,16,32, or 64)
1178193267Sjkim *
1179193267Sjkim * RETURN:      None
1180193267Sjkim *
1181193267Sjkim * DESCRIPTION: Write data to a physical memory address
1182193267Sjkim *
1183193267Sjkim *****************************************************************************/
1184193267Sjkim
1185193267SjkimACPI_STATUS
1186193267SjkimAcpiOsWriteMemory (
1187193267Sjkim    ACPI_PHYSICAL_ADDRESS   Address,
1188231844Sjkim    UINT64                  Value,
1189193267Sjkim    UINT32                  Width)
1190193267Sjkim{
1191193267Sjkim
1192193267Sjkim    return (AE_OK);
1193193267Sjkim}
1194193267Sjkim
1195193267Sjkim
1196193267Sjkim/******************************************************************************
1197193267Sjkim *
1198193267Sjkim * FUNCTION:    AcpiOsReadable
1199193267Sjkim *
1200193267Sjkim * PARAMETERS:  Pointer             - Area to be verified
1201193267Sjkim *              Length              - Size of area
1202193267Sjkim *
1203193267Sjkim * RETURN:      TRUE if readable for entire length
1204193267Sjkim *
1205193267Sjkim * DESCRIPTION: Verify that a pointer is valid for reading
1206193267Sjkim *
1207193267Sjkim *****************************************************************************/
1208193267Sjkim
1209193267SjkimBOOLEAN
1210193267SjkimAcpiOsReadable (
1211193267Sjkim    void                    *Pointer,
1212193267Sjkim    ACPI_SIZE               Length)
1213193267Sjkim{
1214193267Sjkim
1215193267Sjkim    return (TRUE);
1216193267Sjkim}
1217193267Sjkim
1218193267Sjkim
1219193267Sjkim/******************************************************************************
1220193267Sjkim *
1221193267Sjkim * FUNCTION:    AcpiOsWritable
1222193267Sjkim *
1223193267Sjkim * PARAMETERS:  Pointer             - Area to be verified
1224193267Sjkim *              Length              - Size of area
1225193267Sjkim *
1226193267Sjkim * RETURN:      TRUE if writable for entire length
1227193267Sjkim *
1228193267Sjkim * DESCRIPTION: Verify that a pointer is valid for writing
1229193267Sjkim *
1230193267Sjkim *****************************************************************************/
1231193267Sjkim
1232193267SjkimBOOLEAN
1233193267SjkimAcpiOsWritable (
1234193267Sjkim    void                    *Pointer,
1235193267Sjkim    ACPI_SIZE               Length)
1236193267Sjkim{
1237193267Sjkim
1238193267Sjkim    return (TRUE);
1239193267Sjkim}
1240193267Sjkim
1241193267Sjkim
1242193267Sjkim/******************************************************************************
1243193267Sjkim *
1244223480Sjkim * FUNCTION:    AcpiOsSignal
1245223480Sjkim *
1246223480Sjkim * PARAMETERS:  Function            - ACPI CA signal function code
1247223480Sjkim *              Info                - Pointer to function-dependent structure
1248223480Sjkim *
1249223480Sjkim * RETURN:      Status
1250223480Sjkim *
1251223480Sjkim * DESCRIPTION: Miscellaneous functions. Example implementation only.
1252223480Sjkim *
1253223480Sjkim *****************************************************************************/
1254223480Sjkim
1255223480SjkimACPI_STATUS
1256223480SjkimAcpiOsSignal (
1257223480Sjkim    UINT32                  Function,
1258223480Sjkim    void                    *Info)
1259223480Sjkim{
1260223480Sjkim
1261223480Sjkim    switch (Function)
1262223480Sjkim    {
1263223480Sjkim    case ACPI_SIGNAL_FATAL:
1264223480Sjkim        break;
1265223480Sjkim
1266223480Sjkim    case ACPI_SIGNAL_BREAKPOINT:
1267223480Sjkim        break;
1268223480Sjkim
1269223480Sjkim    default:
1270223480Sjkim        break;
1271223480Sjkim    }
1272223480Sjkim
1273223480Sjkim    return (AE_OK);
1274223480Sjkim}
1275223480Sjkim
1276223480Sjkim/* Optional multi-thread support */
1277223480Sjkim
1278223480Sjkim#ifndef ACPI_SINGLE_THREADED
1279223480Sjkim/******************************************************************************
1280223480Sjkim *
1281193267Sjkim * FUNCTION:    AcpiOsGetThreadId
1282193267Sjkim *
1283193267Sjkim * PARAMETERS:  None
1284193267Sjkim *
1285193267Sjkim * RETURN:      Id of the running thread
1286193267Sjkim *
1287213800Sjkim * DESCRIPTION: Get the ID of the current (running) thread
1288193267Sjkim *
1289193267Sjkim *****************************************************************************/
1290193267Sjkim
1291193267SjkimACPI_THREAD_ID
1292212700SjkimAcpiOsGetThreadId (
1293212700Sjkim    void)
1294193267Sjkim{
1295227896Sjkim    pthread_t               thread;
1296193267Sjkim
1297227896Sjkim
1298227896Sjkim    thread = pthread_self();
1299227896Sjkim    return (ACPI_CAST_PTHREAD_T (thread));
1300193267Sjkim}
1301193267Sjkim
1302193267Sjkim
1303193267Sjkim/******************************************************************************
1304193267Sjkim *
1305223480Sjkim * FUNCTION:    AcpiOsExecute
1306193267Sjkim *
1307223480Sjkim * PARAMETERS:  Type                - Type of execution
1308223480Sjkim *              Function            - Address of the function to execute
1309223480Sjkim *              Context             - Passed as a parameter to the function
1310193267Sjkim *
1311223480Sjkim * RETURN:      Status.
1312193267Sjkim *
1313223480Sjkim * DESCRIPTION: Execute a new thread
1314193267Sjkim *
1315193267Sjkim *****************************************************************************/
1316193267Sjkim
1317193267SjkimACPI_STATUS
1318223480SjkimAcpiOsExecute (
1319223480Sjkim    ACPI_EXECUTE_TYPE       Type,
1320223480Sjkim    ACPI_OSD_EXEC_CALLBACK  Function,
1321223480Sjkim    void                    *Context)
1322193267Sjkim{
1323223480Sjkim    pthread_t               thread;
1324223480Sjkim    int                     ret;
1325193267Sjkim
1326223480Sjkim
1327223480Sjkim    ret = pthread_create (&thread, NULL, (PTHREAD_CALLBACK) Function, Context);
1328223480Sjkim    if (ret)
1329193267Sjkim    {
1330223480Sjkim        AcpiOsPrintf("Create thread failed");
1331193267Sjkim    }
1332223480Sjkim    return (0);
1333223480Sjkim}
1334193267Sjkim
1335223480Sjkim#endif /* ACPI_SINGLE_THREADED */
1336235945Sjkim
1337235945Sjkim
1338235945Sjkim/******************************************************************************
1339235945Sjkim *
1340235945Sjkim * FUNCTION:    AcpiOsWaitEventsComplete
1341235945Sjkim *
1342235945Sjkim * PARAMETERS:  None
1343235945Sjkim *
1344235945Sjkim * RETURN:      None
1345235945Sjkim *
1346235945Sjkim * DESCRIPTION: Wait for all asynchronous events to complete. This
1347235945Sjkim *              implementation does nothing.
1348235945Sjkim *
1349235945Sjkim *****************************************************************************/
1350235945Sjkim
1351235945Sjkimvoid
1352235945SjkimAcpiOsWaitEventsComplete (
1353235945Sjkim    void)
1354235945Sjkim{
1355235945Sjkim    return;
1356235945Sjkim}
1357