1 /****************************************************************************** 2 * 3 * Module Name: oszephyr - Zephyr OSL 4 * 5 *****************************************************************************/ 6 7 /****************************************************************************** 8 * 9 * 1. Copyright Notice 10 * 11 * Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp. 12 * All rights reserved. 13 * 14 * 2. License 15 * 16 * 2.1. This is your license from Intel Corp. under its intellectual property 17 * rights. You may have additional license terms from the party that provided 18 * you this software, covering your right to use that party's intellectual 19 * property rights. 20 * 21 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22 * copy of the source code appearing in this file ("Covered Code") an 23 * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24 * base code distributed originally by Intel ("Original Intel Code") to copy, 25 * make derivatives, distribute, use and display any portion of the Covered 26 * Code in any form, with the right to sublicense such rights; and 27 * 28 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29 * license (with the right to sublicense), under only those claims of Intel 30 * patents that are infringed by the Original Intel Code, to make, use, sell, 31 * offer to sell, and import the Covered Code and derivative works thereof 32 * solely to the minimum extent necessary to exercise the above copyright 33 * license, and in no event shall the patent license extend to any additions 34 * to or modifications of the Original Intel Code. No other license or right 35 * is granted directly or by implication, estoppel or otherwise; 36 * 37 * The above copyright and patent license is granted only if the following 38 * conditions are met: 39 * 40 * 3. Conditions 41 * 42 * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43 * Redistribution of source code of any substantial portion of the Covered 44 * Code or modification with rights to further distribute source must include 45 * the above Copyright Notice, the above License, this list of Conditions, 46 * and the following Disclaimer and Export Compliance provision. In addition, 47 * Licensee must cause all Covered Code to which Licensee contributes to 48 * contain a file documenting the changes Licensee made to create that Covered 49 * Code and the date of any change. Licensee must include in that file the 50 * documentation of any changes made by any predecessor Licensee. Licensee 51 * must include a prominent statement that the modification is derived, 52 * directly or indirectly, from Original Intel Code. 53 * 54 * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55 * Redistribution of source code of any substantial portion of the Covered 56 * Code or modification without rights to further distribute source must 57 * include the following Disclaimer and Export Compliance provision in the 58 * documentation and/or other materials provided with distribution. In 59 * addition, Licensee may not authorize further sublicense of source of any 60 * portion of the Covered Code, and must include terms to the effect that the 61 * license from Licensee to its licensee is limited to the intellectual 62 * property embodied in the software Licensee provides to its licensee, and 63 * not to intellectual property embodied in modifications its licensee may 64 * make. 65 * 66 * 3.3. Redistribution of Executable. Redistribution in executable form of any 67 * substantial portion of the Covered Code or modification must reproduce the 68 * above Copyright Notice, and the following Disclaimer and Export Compliance 69 * provision in the documentation and/or other materials provided with the 70 * distribution. 71 * 72 * 3.4. Intel retains all right, title, and interest in and to the Original 73 * Intel Code. 74 * 75 * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76 * Intel shall be used in advertising or otherwise to promote the sale, use or 77 * other dealings in products derived from or relating to the Covered Code 78 * without prior written authorization from Intel. 79 * 80 * 4. Disclaimer and Export Compliance 81 * 82 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83 * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85 * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86 * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88 * PARTICULAR PURPOSE. 89 * 90 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97 * LIMITED REMEDY. 98 * 99 * 4.3. Licensee shall not export, either directly or indirectly, any of this 100 * software or system incorporating such software without first obtaining any 101 * required license or other approval from the U. S. Department of Commerce or 102 * any other agency or department of the United States Government. In the 103 * event Licensee exports any such software from the United States or 104 * re-exports any such software from a foreign destination, Licensee shall 105 * ensure that the distribution and export/re-export of the software is in 106 * compliance with all laws, regulations, orders, or other restrictions of the 107 * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108 * any of its subsidiaries will export/re-export any technical data, process, 109 * software, or service, directly or indirectly, to any country for which the 110 * United States government or any agency thereof requires an export license, 111 * other governmental approval, or letter of assurance, without first obtaining 112 * such license, approval or letter. 113 * 114 ***************************************************************************** 115 * 116 * Alternatively, you may choose to be licensed under the terms of the 117 * following license: 118 * 119 * Redistribution and use in source and binary forms, with or without 120 * modification, are permitted provided that the following conditions 121 * are met: 122 * 1. Redistributions of source code must retain the above copyright 123 * notice, this list of conditions, and the following disclaimer, 124 * without modification. 125 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 126 * substantially similar to the "NO WARRANTY" disclaimer below 127 * ("Disclaimer") and any redistribution must be conditioned upon 128 * including a substantially similar Disclaimer requirement for further 129 * binary redistribution. 130 * 3. Neither the names of the above-listed copyright holders nor the names 131 * of any contributors may be used to endorse or promote products derived 132 * from this software without specific prior written permission. 133 * 134 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 135 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 136 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 137 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 138 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 139 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 140 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 141 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 142 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 143 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 144 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 145 * 146 * Alternatively, you may choose to be licensed under the terms of the 147 * GNU General Public License ("GPL") version 2 as published by the Free 148 * Software Foundation. 149 * 150 *****************************************************************************/ 151 152 #include "acpi.h" 153 #include "accommon.h" 154 #include "acapps.h" 155 #include "aslcompiler.h" 156 #include <zephyr/arch/x86/x86_acpi_osal.h> 157 #include <zephyr/drivers/pcie/pcie.h> 158 #include <zephyr/dt-bindings/interrupt-controller/intel-ioapic.h> 159 #include <zephyr/sys/__assert.h> 160 161 #include <zephyr/logging/log.h> 162 LOG_MODULE_DECLARE(acpica, LOG_LEVEL_ERR); 163 164 typedef void (*zephyr_irq_t)(const void *); 165 166 /* Global variables use from acpica lib. */ 167 BOOLEAN AslGbl_DoTemplates = FALSE; 168 BOOLEAN AslGbl_VerboseTemplates = FALSE; 169 170 char AslGbl_MsgBuffer[ASL_MSG_BUFFER_SIZE]; 171 static BOOLEAN EnDbgPrint; 172 static ACPI_PHYSICAL_ADDRESS RsdpPhyAdd; 173 174 /****************************************************************************** 175 * 176 * FUNCTION: AcpiOsReadable 177 * 178 * PARAMETERS: Pointer - Area to be verified 179 * Length - Size of area 180 * 181 * RETURN: TRUE if readable for entire Length 182 * 183 * DESCRIPTION: Verify that a pointer is valid for reading 184 * 185 *****************************************************************************/ 186 187 BOOLEAN 188 AcpiOsReadable ( 189 void *Pointer, 190 ACPI_SIZE Length) 191 { 192 return (TRUE); 193 } 194 195 196 /****************************************************************************** 197 * 198 * FUNCTION: AcpiEnableDbgPrint 199 * 200 * PARAMETERS: en, - Enable/Disable debug print 201 * 202 * RETURN: None 203 * 204 * DESCRIPTION: Formatted output 205 * 206 *****************************************************************************/ 207 208 void 209 AcpiEnableDbgPrint ( 210 bool Enable) 211 { 212 if (Enable) 213 { 214 EnDbgPrint = TRUE; 215 } 216 else 217 { 218 EnDbgPrint = FALSE; 219 } 220 } 221 222 223 /****************************************************************************** 224 * 225 * FUNCTION: AcpiOsPrintf 226 * 227 * PARAMETERS: Fmt, ... - Standard printf format 228 * 229 * RETURN: None 230 * 231 * DESCRIPTION: Formatted output 232 * 233 *****************************************************************************/ 234 235 void ACPI_INTERNAL_VAR_XFACE 236 AcpiOsPrintf ( 237 const char *Fmt, 238 ...) 239 { 240 va_list args; 241 242 va_start (args, Fmt); 243 244 if (EnDbgPrint) 245 { 246 vprintk (Fmt, args); 247 } 248 249 va_end (args); 250 } 251 252 253 /****************************************************************************** 254 * 255 * FUNCTION: AcpiOsGetLine 256 * 257 * PARAMETERS: Buffer - Where to return the command line 258 * BufferLength - Maximum Length of Buffer 259 * BytesRead - Where the actual byte count is returned 260 * 261 * RETURN: Status and actual bytes read 262 * 263 * DESCRIPTION: Formatted input with argument list pointer 264 * 265 *****************************************************************************/ 266 267 ACPI_STATUS 268 AcpiOsGetLine ( 269 char *Buffer, 270 UINT32 BufferLength, 271 UINT32 *BytesRead) 272 { 273 return (-1); 274 } 275 276 277 /****************************************************************************** 278 * 279 * FUNCTION: AcpiOsAllocate 280 * 281 * PARAMETERS: Size - Amount to allocate, in bytes 282 * 283 * RETURN: Pointer to the new allocation. Null on error. 284 * 285 * DESCRIPTION: Allocate memory. Algorithm is dependent on the OS. 286 * 287 *****************************************************************************/ 288 289 void * 290 AcpiOsAllocate ( 291 ACPI_SIZE Size) 292 { 293 return (k_malloc (Size)); 294 } 295 296 297 #ifdef USE_NATIVE_ALLOCATE_ZEROED 298 /****************************************************************************** 299 * 300 * FUNCTION: AcpiOsAllocateZeroed 301 * 302 * PARAMETERS: Size - Amount to allocate, in bytes 303 * 304 * RETURN: Pointer to the new allocation. Null on error. 305 * 306 * DESCRIPTION: Allocate and zero memory. Algorithm is dependent on the OS. 307 * 308 *****************************************************************************/ 309 310 void * 311 AcpiOsAllocateZeroed ( 312 ACPI_SIZE Size) 313 { 314 void *mem; 315 316 mem = AcpiOsAllocate (Size); 317 318 if (mem) 319 { 320 memset (mem, 0, Size); 321 } 322 323 return (mem); 324 } 325 #endif 326 327 328 /****************************************************************************** 329 * 330 * FUNCTION: AcpiOsFree 331 * 332 * PARAMETERS: Mem - Pointer to previously allocated memory 333 * 334 * RETURN: None. 335 * 336 * DESCRIPTION: Free memory allocated via AcpiOsAllocate 337 * 338 *****************************************************************************/ 339 340 void 341 AcpiOsFree ( 342 void *Mem) 343 { 344 k_free (Mem); 345 } 346 347 348 /****************************************************************************** 349 * 350 * FUNCTION: AcpiOsReadMemory 351 * 352 * PARAMETERS: Address - Physical Memory Address to read 353 * Value - Where Value is placed 354 * Width - Number of bits (8,16,32, or 64) 355 * 356 * RETURN: Value read from physical memory Address. Always returned 357 * as a 64-bit integer, regardless of the read Width. 358 * 359 * DESCRIPTION: Read data from a physical memory Address 360 * 361 *****************************************************************************/ 362 363 ACPI_STATUS 364 AcpiOsReadMemory ( 365 ACPI_PHYSICAL_ADDRESS Address, 366 UINT64 *Value, 367 UINT32 Width) 368 { 369 switch (Width) 370 { 371 case 8: 372 373 *((UINT8 *) Value) = sys_read8 (Address); 374 break; 375 376 case 16: 377 378 *((UINT16 *) Value) = sys_read16 (Address); 379 break; 380 381 case 32: 382 383 *((UINT32 *) Value) = sys_read32 (Address); 384 break; 385 #if defined(__x86_64__) 386 case 64: 387 388 *((UINT64 *) Value) = sys_read64 (Address); 389 break; 390 #endif 391 default: 392 393 return (AE_BAD_PARAMETER); 394 } 395 396 return (AE_OK); 397 } 398 399 400 /****************************************************************************** 401 * 402 * FUNCTION: AcpiOsWriteMemory 403 * 404 * PARAMETERS: Address - Physical Memory Address to write 405 * Value - Value to write 406 * Width - Number of bits (8,16,32, or 64) 407 * 408 * RETURN: None 409 * 410 * DESCRIPTION: Write data to a physical memory Address 411 * 412 *****************************************************************************/ 413 414 ACPI_STATUS 415 AcpiOsWriteMemory ( 416 ACPI_PHYSICAL_ADDRESS Address, 417 UINT64 Value, 418 UINT32 Width) 419 { 420 switch (Width) 421 { 422 case 8: 423 424 sys_write8 ((UINT8) Value, Address); 425 break; 426 427 case 16: 428 429 sys_write16 ((UINT16) Value, Address); 430 break; 431 432 case 32: 433 434 sys_write32 ((UINT32) Value, Address); 435 break; 436 #if defined(__x86_64__) 437 case 64: 438 439 sys_write64 ((UINT64) Value, Address); 440 break; 441 #endif 442 default: 443 444 return (AE_BAD_PARAMETER); 445 } 446 447 return (AE_OK); 448 } 449 450 451 /****************************************************************************** 452 * 453 * FUNCTION: AcpiOsReadPort 454 * 455 * PARAMETERS: Address - Address of I/O port/register to read 456 * Value - Where Value is placed 457 * Width - Number of bits 458 * 459 * RETURN: Value read from port 460 * 461 * DESCRIPTION: Read data from an I/O port or register 462 * 463 *****************************************************************************/ 464 465 ACPI_STATUS 466 AcpiOsReadPort ( 467 ACPI_IO_ADDRESS Address, 468 UINT32 *Value, 469 UINT32 Width) 470 { 471 472 switch (Width) 473 { 474 case 8: 475 476 *((UINT8 *) Value) = sys_in8 (Address); 477 break; 478 479 case 16: 480 481 *((UINT16 *) Value) = sys_in16 (Address); 482 break; 483 484 case 32: 485 486 *((UINT32 *) Value) = sys_in32 (Address); 487 break; 488 489 case 64: 490 491 *((UINT32 *) Value) = sys_in32 (Address); 492 *((UINT32 *) Value + 4) = sys_in32 (Address + 4); 493 break; 494 495 default: 496 497 return (AE_BAD_PARAMETER); 498 } 499 500 return (AE_OK); 501 } 502 503 504 /****************************************************************************** 505 * 506 * FUNCTION: AcpiOsWritePort 507 * 508 * PARAMETERS: Address - Address of I/O port/register to write 509 * Value - Value to write 510 * Width - Number of bits 511 * 512 * RETURN: None 513 * 514 * DESCRIPTION: Write data to an I/O port or register 515 * 516 *****************************************************************************/ 517 518 ACPI_STATUS 519 AcpiOsWritePort ( 520 ACPI_IO_ADDRESS Address, 521 UINT32 Value, 522 UINT32 Width) 523 { 524 525 switch (Width) 526 { 527 case 8: 528 529 sys_out8 ((UINT8) Value, Address); 530 break; 531 532 case 16: 533 534 sys_out16 ((UINT16) Value, Address); 535 break; 536 537 case 32: 538 539 sys_out32 ((UINT32) Value, Address); 540 break; 541 542 case 64: 543 544 sys_out32 ((UINT32) Value, Address); 545 sys_out32 ((UINT32) (Value + 4), (Address + 4)); 546 break; 547 548 default: 549 550 return (AE_BAD_PARAMETER); 551 } 552 553 return (AE_OK); 554 } 555 556 557 /****************************************************************************** 558 * 559 * FUNCTION: AcpiOsWritePciConfiguration 560 * 561 * PARAMETERS: PciId - Seg/Bus/Dev 562 * Register - Device Register 563 * Value - Value to be written 564 * Width - Number of bits 565 * 566 * RETURN: Status 567 * 568 * DESCRIPTION: Write data to PCI configuration space 569 * 570 *****************************************************************************/ 571 572 ACPI_STATUS 573 AcpiOsWritePciConfiguration ( 574 ACPI_PCI_ID *PciId, 575 UINT32 Register, 576 UINT64 Value, 577 UINT32 Width) 578 { 579 UINT32 value32; 580 pcie_bdf_t bdf = PCIE_BDF (PciId->Bus, PciId->Device, PciId->Function); 581 582 583 switch (Width) 584 { 585 case 8: 586 587 value32 = pcie_conf_read (bdf, Register); 588 value32 = (value32 & 0xffffff00) | (UINT8) Value; 589 pcie_conf_write (bdf, Register, value32); 590 break; 591 592 case 16: 593 594 value32 = pcie_conf_read (bdf, Register); 595 value32 = (value32 & 0xffff0000) | (UINT16) Value; 596 pcie_conf_write (bdf, Register, value32); 597 break; 598 599 case 32: 600 601 pcie_conf_write (bdf, Register, (UINT32) Value); 602 break; 603 604 case 64: 605 606 pcie_conf_write (bdf, Register, (UINT32) Value); 607 pcie_conf_write (bdf, (Register + 4), (UINT32) (Value >> 32)); 608 break; 609 610 default: 611 612 return (AE_BAD_PARAMETER); 613 } 614 615 return (AE_OK); 616 } 617 618 619 /****************************************************************************** 620 * 621 * FUNCTION: AcpiOsReadPciConfiguration 622 * 623 * PARAMETERS: PciId - Seg/Bus/Dev 624 * Register - Device Register 625 * Value - Buffer Where Value is placed 626 * Width - Number of bits 627 * 628 * RETURN: Status 629 * 630 * DESCRIPTION: Read data from PCI configuration space 631 * 632 *****************************************************************************/ 633 634 ACPI_STATUS 635 AcpiOsReadPciConfiguration ( 636 ACPI_PCI_ID *PciId, 637 UINT32 Register, 638 UINT64 *Value, 639 UINT32 Width) 640 { 641 642 pcie_bdf_t bdf = PCIE_BDF (PciId->Bus, PciId->Device, PciId->Function); 643 644 switch (Width) 645 { 646 case 8: 647 648 *((UINT8 *) Value) = (UINT8) pcie_conf_read (bdf, Register); 649 break; 650 651 case 16: 652 653 *((UINT16 *) Value) = (UINT16) pcie_conf_read (bdf, Register); 654 break; 655 656 case 32: 657 658 *((UINT32 *) Value) = (UINT32) pcie_conf_read (bdf, Register); 659 break; 660 661 case 64: 662 663 *((UINT32 *) Value) = (UINT32) pcie_conf_read (bdf, Register); 664 *((UINT32 *) Value + 1) = (UINT32) pcie_conf_read (bdf, (Register + 4)); 665 break; 666 667 default: 668 669 return (AE_BAD_PARAMETER); 670 } 671 672 return (AE_OK); 673 } 674 675 676 /****************************************************************************** 677 * 678 * FUNCTION: AcpiOsRedirectOutput 679 * 680 * PARAMETERS: Destination - An open file handle/pointer 681 * 682 * RETURN: None 683 * 684 * DESCRIPTION: Causes redirect of AcpiOsPrintf and AcpiOsVprintf 685 * 686 *****************************************************************************/ 687 688 void 689 AcpiOsRedirectOutput ( 690 void *Destination) 691 { 692 693 } 694 695 696 /****************************************************************************** 697 * 698 * FUNCTION: AcpiOsPredefinedOverride 699 * 700 * PARAMETERS: InitVal - Initial Value of the predefined object 701 * NewVal - The new Value for the object 702 * 703 * RETURN: Status, pointer to Value. Null pointer returned if not 704 * overriding. 705 * 706 * DESCRIPTION: Allow the OS to override predefined names 707 * 708 *****************************************************************************/ 709 710 ACPI_STATUS 711 AcpiOsPredefinedOverride ( 712 const ACPI_PREDEFINED_NAMES *InitVal, 713 ACPI_STRING *NewVal) 714 { 715 716 if (!InitVal || !NewVal) 717 { 718 return (AE_BAD_PARAMETER); 719 } 720 721 *NewVal = NULL; 722 723 return (AE_OK); 724 } 725 726 727 /****************************************************************************** 728 * 729 * FUNCTION: AcpiOsTableOverride 730 * 731 * PARAMETERS: ExistingTable - Header of current table (probably firmware) 732 * NewTable - Where an entire new table is returned. 733 * 734 * RETURN: Status, pointer to new table. Null pointer returned if no 735 * table is available to override 736 * 737 * DESCRIPTION: Return a different version of a table if one is available 738 * 739 *****************************************************************************/ 740 741 ACPI_STATUS 742 AcpiOsTableOverride ( 743 ACPI_TABLE_HEADER *ExistingTable, 744 ACPI_TABLE_HEADER **NewTable) 745 { 746 747 if (!ExistingTable || !NewTable) 748 { 749 return (AE_BAD_PARAMETER); 750 } 751 752 *NewTable = NULL; 753 754 return (AE_NO_ACPI_TABLES); 755 } 756 757 758 /****************************************************************************** 759 * 760 * FUNCTION: AcpiOsGetRootPointer 761 * 762 * PARAMETERS: None 763 * 764 * RETURN: RSDP physical Address 765 * 766 * DESCRIPTION: Gets the root pointer (RSDP) 767 * 768 *****************************************************************************/ 769 770 ACPI_PHYSICAL_ADDRESS 771 AcpiOsGetRootPointer ( 772 void) 773 { 774 LOG_DBG (""); 775 776 if(RsdpPhyAdd) 777 { 778 return RsdpPhyAdd; 779 } 780 781 RsdpPhyAdd = (ACPI_PHYSICAL_ADDRESS)acpi_rsdp_get(); 782 783 return RsdpPhyAdd; 784 } 785 786 #ifndef ACPI_USE_NATIVE_MEMORY_MAPPING 787 /****************************************************************************** 788 * 789 * FUNCTION: AcpiOsMapMemory 790 * 791 * PARAMETERS: Where - Physical Address of memory to be mapped 792 * Length - How much memory to map 793 * 794 * RETURN: Pointer to mapped memory. Null on error. 795 * 796 * DESCRIPTION: Map physical memory into caller's Address space 797 * 798 *****************************************************************************/ 799 800 void * 801 AcpiOsMapMemory ( 802 ACPI_PHYSICAL_ADDRESS Where, 803 ACPI_SIZE Length) 804 { 805 uint8_t *VirtlAdd; 806 807 LOG_DBG (""); 808 z_phys_map (&VirtlAdd, Where, Length, K_MEM_PERM_RW); 809 return ((void *) VirtlAdd); 810 } 811 #endif 812 813 814 /****************************************************************************** 815 * 816 * FUNCTION: AcpiOsUnmapMemory 817 * 818 * PARAMETERS: Where - Logical Address of memory to be unmapped 819 * Length - How much memory to unmap 820 * 821 * RETURN: None. 822 * 823 * DESCRIPTION: Delete a previously created mapping. Where and Length must 824 * correspond to a previous mapping exactly. 825 * 826 *****************************************************************************/ 827 828 void 829 AcpiOsUnmapMemory ( 830 void *Where, 831 ACPI_SIZE Length) 832 { 833 LOG_DBG (""); 834 z_phys_unmap (Where, Length); 835 } 836 837 838 /****************************************************************************** 839 * 840 * FUNCTION: AcpiOsPhysicalTableOverride 841 * 842 * PARAMETERS: ExistingTable - Header of current table (probably firmware) 843 * NewAddress - Where new table Address is returned 844 * (Physical Address) 845 * NewTableLength - Where new table Length is returned 846 * 847 * RETURN: Status, Address/Length of new table. Null pointer returned 848 * if no table is available to override. 849 * 850 * DESCRIPTION: Returns AE_SUPPORT, function not used in user space. 851 * 852 *****************************************************************************/ 853 854 ACPI_STATUS 855 AcpiOsPhysicalTableOverride ( 856 ACPI_TABLE_HEADER *ExistingTable, 857 ACPI_PHYSICAL_ADDRESS *NewAddress, 858 UINT32 *NewTableLength) 859 { 860 861 LOG_DBG (""); 862 return (AE_SUPPORT); 863 } 864 865 866 /****************************************************************************** 867 * 868 * FUNCTION: AcpiOsInitialize 869 * 870 * PARAMETERS: None 871 * 872 * RETURN: Status 873 * 874 * DESCRIPTION: Init this OSL 875 * 876 *****************************************************************************/ 877 878 ACPI_STATUS 879 AcpiOsInitialize ( 880 void) 881 { 882 LOG_DBG (""); 883 return (AE_OK); 884 } 885 886 887 /****************************************************************************** 888 * 889 * FUNCTION: AcpiOsStall 890 * 891 * PARAMETERS: Microseconds - Time to stall 892 * 893 * RETURN: None. Blocks until stall is completed. 894 * 895 * DESCRIPTION: Sleep at microsecond granularity 896 * 897 *****************************************************************************/ 898 899 void 900 AcpiOsStall ( 901 UINT32 Microseconds) 902 { 903 k_busy_wait (Microseconds); 904 } 905 906 907 /****************************************************************************** 908 * 909 * FUNCTION: AcpiOsSleep 910 * 911 * PARAMETERS: Milliseconds - Time to sleep 912 * 913 * RETURN: None. Blocks until sleep is completed. 914 * 915 * DESCRIPTION: Sleep at millisecond granularity 916 * 917 *****************************************************************************/ 918 919 void 920 AcpiOsSleep ( 921 UINT64 Milliseconds) 922 { 923 k_msleep ((UINT32) Milliseconds); 924 } 925 926 927 /****************************************************************************** 928 * 929 * FUNCTION: AcpiOsEnterSleep 930 * 931 * PARAMETERS: SleepState - Which sleep state to enter 932 * RegaValue - Register A Value 933 * RegbValue - Register B Value 934 * 935 * RETURN: Status 936 * 937 * DESCRIPTION: A hook before writing sleep registers to enter the sleep 938 * state. Return AE_CTRL_SKIP to skip further sleep register 939 * writes. 940 * 941 *****************************************************************************/ 942 943 ACPI_STATUS 944 AcpiOsEnterSleep ( 945 UINT8 SleepState, 946 UINT32 RegaValue, 947 UINT32 RegbValue) 948 { 949 __ASSERT (FALSE, "function Not implemented"); 950 return (AE_OK); 951 } 952 953 954 /****************************************************************************** 955 * 956 * FUNCTION: AcpiOsGetTimer 957 * 958 * PARAMETERS: None 959 * 960 * RETURN: Current ticks in 100-nanosecond units 961 * 962 * DESCRIPTION: Get the Value of a system timer 963 * 964 ******************************************************************************/ 965 966 UINT64 967 AcpiOsGetTimer ( 968 void) 969 { 970 return acpi_timer_get(); 971 } 972 973 /****************************************************************************** 974 * 975 * FUNCTION: AcpiOsInstallInterruptHandler 976 * 977 * PARAMETERS: InterruptNumber - Level handler should respond to. 978 * ServiceRoutine - Address of the ACPI interrupt handler 979 * Context - User context 980 * 981 * RETURN: Handle to the newly installed handler. 982 * 983 * DESCRIPTION: Install an interrupt handler. Used to install the ACPI 984 * OS-independent handler. 985 * 986 *****************************************************************************/ 987 988 UINT32 989 AcpiOsInstallInterruptHandler ( 990 UINT32 InterruptNumber, 991 ACPI_OSD_HANDLER ServiceRoutine, 992 void *Context) 993 { 994 LOG_DBG (""); 995 irq_connect_dynamic (InterruptNumber, 3, (zephyr_irq_t) ServiceRoutine, Context, 996 IRQ_TYPE_LOWEST_LEVEL_LOW); 997 irq_enable (InterruptNumber); 998 return (AE_OK); 999 } 1000 1001 1002 /****************************************************************************** 1003 * 1004 * FUNCTION: AcpiOsRemoveInterruptHandler 1005 * 1006 * PARAMETERS: Handle - Returned when handler was installed 1007 * 1008 * RETURN: Status 1009 * 1010 * DESCRIPTION: Uninstalls an interrupt handler. 1011 * 1012 *****************************************************************************/ 1013 1014 ACPI_STATUS 1015 AcpiOsRemoveInterruptHandler ( 1016 UINT32 InterruptNumber, 1017 ACPI_OSD_HANDLER ServiceRoutine) 1018 { 1019 1020 LOG_DBG (""); 1021 irq_disable (InterruptNumber); 1022 return (AE_OK); 1023 } 1024 1025 1026 /****************************************************************************** 1027 * 1028 * FUNCTION: AcpiOsSignal 1029 * 1030 * PARAMETERS: Function - ACPICA signal function code 1031 * Info - Pointer to function-dependent structure 1032 * 1033 * RETURN: Status 1034 * 1035 * DESCRIPTION: Miscellaneous functions. Example implementation only. 1036 * 1037 *****************************************************************************/ 1038 1039 ACPI_STATUS 1040 AcpiOsSignal ( 1041 UINT32 Function, 1042 void *Info) 1043 { 1044 switch (Function) 1045 { 1046 case ACPI_SIGNAL_FATAL: 1047 LOG_DBG ("ACPI_SIGNAL_FATAL error"); 1048 break; 1049 1050 case ACPI_SIGNAL_BREAKPOINT: 1051 LOG_DBG ("ACPI_SIGNAL_BREAKPOINT"); 1052 break; 1053 1054 default: 1055 break; 1056 } 1057 1058 return (AE_OK); 1059 } 1060 1061 1062 /****************************************************************************** 1063 * 1064 * FUNCTION: Spinlock/Semaphore interfaces 1065 * 1066 * DESCRIPTION: Map these interfaces to semaphore interfaces 1067 * 1068 *****************************************************************************/ 1069 1070 #ifdef ACPI_SINGLE_THREADED 1071 ACPI_STATUS 1072 AcpiOsCreateLock ( 1073 ACPI_SPINLOCK *OutHandle) 1074 { 1075 LOG_DBG (""); 1076 1077 return (AE_OK); 1078 } 1079 1080 void 1081 AcpiOsDeleteLock ( 1082 ACPI_SPINLOCK Handle) 1083 { 1084 LOG_DBG (""); 1085 } 1086 1087 ACPI_CPU_FLAGS 1088 AcpiOsAcquireLock ( 1089 ACPI_SPINLOCK Handle) 1090 { 1091 LOG_DBG (""); 1092 return (0); 1093 } 1094 1095 void 1096 AcpiOsReleaseLock ( 1097 ACPI_SPINLOCK Handle, 1098 ACPI_CPU_FLAGS Flags) 1099 { 1100 LOG_DBG (""); 1101 } 1102 1103 ACPI_STATUS 1104 AcpiOsCreateSemaphore ( 1105 UINT32 MaxUnits, 1106 UINT32 InitialUnits, 1107 ACPI_HANDLE *OutHandle) 1108 { 1109 *OutHandle = (ACPI_HANDLE) 1; 1110 return (AE_OK); 1111 } 1112 1113 ACPI_STATUS 1114 AcpiOsDeleteSemaphore ( 1115 ACPI_HANDLE Handle) 1116 { 1117 return (AE_OK); 1118 } 1119 1120 ACPI_STATUS 1121 AcpiOsWaitSemaphore ( 1122 ACPI_HANDLE Handle, 1123 UINT32 Units, 1124 UINT16 Timeout) 1125 { 1126 return (AE_OK); 1127 } 1128 1129 ACPI_STATUS 1130 AcpiOsSignalSemaphore ( 1131 ACPI_HANDLE Handle, 1132 UINT32 Units) 1133 { 1134 return (AE_OK); 1135 } 1136 1137 ACPI_THREAD_ID 1138 AcpiOsGetThreadId ( 1139 void) 1140 { 1141 LOG_DBG (""); 1142 return (1); 1143 } 1144 1145 ACPI_STATUS 1146 AcpiOsExecute ( 1147 ACPI_EXECUTE_TYPE Type, 1148 ACPI_OSD_EXEC_CALLBACK Function, 1149 void *Context) 1150 { 1151 Function (Context); 1152 return (AE_OK); 1153 } 1154 #endif 1155