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