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