1db2bae30SDana Myers /****************************************************************************** 2db2bae30SDana Myers * 3db2bae30SDana Myers * Module Name: exregion - ACPI default OpRegion (address space) handlers 4db2bae30SDana Myers * 5db2bae30SDana Myers *****************************************************************************/ 6db2bae30SDana Myers 726f3cdf0SGordon Ross /* 8*385cc6b4SJerry Jelinek * Copyright (C) 2000 - 2016, Intel Corp. 9db2bae30SDana Myers * All rights reserved. 10db2bae30SDana Myers * 1126f3cdf0SGordon Ross * Redistribution and use in source and binary forms, with or without 1226f3cdf0SGordon Ross * modification, are permitted provided that the following conditions 1326f3cdf0SGordon Ross * are met: 1426f3cdf0SGordon Ross * 1. Redistributions of source code must retain the above copyright 1526f3cdf0SGordon Ross * notice, this list of conditions, and the following disclaimer, 1626f3cdf0SGordon Ross * without modification. 1726f3cdf0SGordon Ross * 2. Redistributions in binary form must reproduce at minimum a disclaimer 1826f3cdf0SGordon Ross * substantially similar to the "NO WARRANTY" disclaimer below 1926f3cdf0SGordon Ross * ("Disclaimer") and any redistribution must be conditioned upon 2026f3cdf0SGordon Ross * including a substantially similar Disclaimer requirement for further 2126f3cdf0SGordon Ross * binary redistribution. 2226f3cdf0SGordon Ross * 3. Neither the names of the above-listed copyright holders nor the names 2326f3cdf0SGordon Ross * of any contributors may be used to endorse or promote products derived 2426f3cdf0SGordon Ross * from this software without specific prior written permission. 25db2bae30SDana Myers * 2626f3cdf0SGordon Ross * Alternatively, this software may be distributed under the terms of the 2726f3cdf0SGordon Ross * GNU General Public License ("GPL") version 2 as published by the Free 2826f3cdf0SGordon Ross * Software Foundation. 29db2bae30SDana Myers * 3026f3cdf0SGordon Ross * NO WARRANTY 3126f3cdf0SGordon Ross * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 3226f3cdf0SGordon Ross * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3326f3cdf0SGordon Ross * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 3426f3cdf0SGordon Ross * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3526f3cdf0SGordon Ross * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 3626f3cdf0SGordon Ross * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3726f3cdf0SGordon Ross * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3826f3cdf0SGordon Ross * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 3926f3cdf0SGordon Ross * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 4026f3cdf0SGordon Ross * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 4126f3cdf0SGordon Ross * POSSIBILITY OF SUCH DAMAGES. 4226f3cdf0SGordon Ross */ 43db2bae30SDana Myers 44db2bae30SDana Myers #include "acpi.h" 45aa2aa9a6SDana Myers #include "accommon.h" 46db2bae30SDana Myers #include "acinterp.h" 47db2bae30SDana Myers 48db2bae30SDana Myers 49db2bae30SDana Myers #define _COMPONENT ACPI_EXECUTER 50db2bae30SDana Myers ACPI_MODULE_NAME ("exregion") 51db2bae30SDana Myers 52db2bae30SDana Myers 53db2bae30SDana Myers /******************************************************************************* 54db2bae30SDana Myers * 55db2bae30SDana Myers * FUNCTION: AcpiExSystemMemorySpaceHandler 56db2bae30SDana Myers * 57db2bae30SDana Myers * PARAMETERS: Function - Read or Write operation 58db2bae30SDana Myers * Address - Where in the space to read or write 59db2bae30SDana Myers * BitWidth - Field width in bits (8, 16, or 32) 60db2bae30SDana Myers * Value - Pointer to in or out value 61db2bae30SDana Myers * HandlerContext - Pointer to Handler's context 62db2bae30SDana Myers * RegionContext - Pointer to context specific to the 63db2bae30SDana Myers * accessed region 64db2bae30SDana Myers * 65db2bae30SDana Myers * RETURN: Status 66db2bae30SDana Myers * 67db2bae30SDana Myers * DESCRIPTION: Handler for the System Memory address space (Op Region) 68db2bae30SDana Myers * 69db2bae30SDana Myers ******************************************************************************/ 70db2bae30SDana Myers 71db2bae30SDana Myers ACPI_STATUS 72db2bae30SDana Myers AcpiExSystemMemorySpaceHandler ( 73db2bae30SDana Myers UINT32 Function, 74db2bae30SDana Myers ACPI_PHYSICAL_ADDRESS Address, 75db2bae30SDana Myers UINT32 BitWidth, 7626f3cdf0SGordon Ross UINT64 *Value, 77db2bae30SDana Myers void *HandlerContext, 78db2bae30SDana Myers void *RegionContext) 79db2bae30SDana Myers { 80db2bae30SDana Myers ACPI_STATUS Status = AE_OK; 81db2bae30SDana Myers void *LogicalAddrPtr = NULL; 82db2bae30SDana Myers ACPI_MEM_SPACE_CONTEXT *MemInfo = RegionContext; 83db2bae30SDana Myers UINT32 Length; 8457190917SDana Myers ACPI_SIZE MapLength; 8557190917SDana Myers ACPI_SIZE PageBoundaryMapLength; 86db2bae30SDana Myers #ifdef ACPI_MISALIGNMENT_NOT_SUPPORTED 87db2bae30SDana Myers UINT32 Remainder; 88db2bae30SDana Myers #endif 89db2bae30SDana Myers 90db2bae30SDana Myers 91db2bae30SDana Myers ACPI_FUNCTION_TRACE (ExSystemMemorySpaceHandler); 92db2bae30SDana Myers 93db2bae30SDana Myers 94db2bae30SDana Myers /* Validate and translate the bit width */ 95db2bae30SDana Myers 96db2bae30SDana Myers switch (BitWidth) 97db2bae30SDana Myers { 98db2bae30SDana Myers case 8: 99*385cc6b4SJerry Jelinek 100db2bae30SDana Myers Length = 1; 101db2bae30SDana Myers break; 102db2bae30SDana Myers 103db2bae30SDana Myers case 16: 104*385cc6b4SJerry Jelinek 105db2bae30SDana Myers Length = 2; 106db2bae30SDana Myers break; 107db2bae30SDana Myers 108db2bae30SDana Myers case 32: 109*385cc6b4SJerry Jelinek 110db2bae30SDana Myers Length = 4; 111db2bae30SDana Myers break; 112db2bae30SDana Myers 113db2bae30SDana Myers case 64: 114*385cc6b4SJerry Jelinek 115db2bae30SDana Myers Length = 8; 116db2bae30SDana Myers break; 117db2bae30SDana Myers 118db2bae30SDana Myers default: 119*385cc6b4SJerry Jelinek 12026f3cdf0SGordon Ross ACPI_ERROR ((AE_INFO, "Invalid SystemMemory width %u", 121db2bae30SDana Myers BitWidth)); 122db2bae30SDana Myers return_ACPI_STATUS (AE_AML_OPERAND_VALUE); 123db2bae30SDana Myers } 124db2bae30SDana Myers 125db2bae30SDana Myers #ifdef ACPI_MISALIGNMENT_NOT_SUPPORTED 126db2bae30SDana Myers /* 127db2bae30SDana Myers * Hardware does not support non-aligned data transfers, we must verify 128db2bae30SDana Myers * the request. 129db2bae30SDana Myers */ 13026f3cdf0SGordon Ross (void) AcpiUtShortDivide ((UINT64) Address, Length, NULL, &Remainder); 131db2bae30SDana Myers if (Remainder != 0) 132db2bae30SDana Myers { 133db2bae30SDana Myers return_ACPI_STATUS (AE_AML_ALIGNMENT); 134db2bae30SDana Myers } 135db2bae30SDana Myers #endif 136db2bae30SDana Myers 137db2bae30SDana Myers /* 138db2bae30SDana Myers * Does the request fit into the cached memory mapping? 139db2bae30SDana Myers * Is 1) Address below the current mapping? OR 140db2bae30SDana Myers * 2) Address beyond the current mapping? 141db2bae30SDana Myers */ 142db2bae30SDana Myers if ((Address < MemInfo->MappedPhysicalAddress) || 14326f3cdf0SGordon Ross (((UINT64) Address + Length) > 14426f3cdf0SGordon Ross ((UINT64) 145db2bae30SDana Myers MemInfo->MappedPhysicalAddress + MemInfo->MappedLength))) 146db2bae30SDana Myers { 147db2bae30SDana Myers /* 148db2bae30SDana Myers * The request cannot be resolved by the current memory mapping; 149db2bae30SDana Myers * Delete the existing mapping and create a new one. 150db2bae30SDana Myers */ 151db2bae30SDana Myers if (MemInfo->MappedLength) 152db2bae30SDana Myers { 153db2bae30SDana Myers /* Valid mapping, delete it */ 154db2bae30SDana Myers 155db2bae30SDana Myers AcpiOsUnmapMemory (MemInfo->MappedLogicalAddress, 156db2bae30SDana Myers MemInfo->MappedLength); 157db2bae30SDana Myers } 158db2bae30SDana Myers 159db2bae30SDana Myers /* 16057190917SDana Myers * October 2009: Attempt to map from the requested address to the 16157190917SDana Myers * end of the region. However, we will never map more than one 16257190917SDana Myers * page, nor will we cross a page boundary. 163db2bae30SDana Myers */ 16457190917SDana Myers MapLength = (ACPI_SIZE) 165db2bae30SDana Myers ((MemInfo->Address + MemInfo->Length) - Address); 166db2bae30SDana Myers 16757190917SDana Myers /* 16857190917SDana Myers * If mapping the entire remaining portion of the region will cross 16957190917SDana Myers * a page boundary, just map up to the page boundary, do not cross. 17057190917SDana Myers * On some systems, crossing a page boundary while mapping regions 17157190917SDana Myers * can cause warnings if the pages have different attributes 17257190917SDana Myers * due to resource management. 17357190917SDana Myers * 17457190917SDana Myers * This has the added benefit of constraining a single mapping to 17557190917SDana Myers * one page, which is similar to the original code that used a 4k 17657190917SDana Myers * maximum window. 17757190917SDana Myers */ 178*385cc6b4SJerry Jelinek PageBoundaryMapLength = (ACPI_SIZE) 179*385cc6b4SJerry Jelinek (ACPI_ROUND_UP (Address, ACPI_DEFAULT_PAGE_SIZE) - Address); 18057190917SDana Myers if (PageBoundaryMapLength == 0) 181db2bae30SDana Myers { 18257190917SDana Myers PageBoundaryMapLength = ACPI_DEFAULT_PAGE_SIZE; 18357190917SDana Myers } 18457190917SDana Myers 18557190917SDana Myers if (MapLength > PageBoundaryMapLength) 18657190917SDana Myers { 18757190917SDana Myers MapLength = PageBoundaryMapLength; 188db2bae30SDana Myers } 189db2bae30SDana Myers 190db2bae30SDana Myers /* Create a new mapping starting at the address given */ 191db2bae30SDana Myers 192*385cc6b4SJerry Jelinek MemInfo->MappedLogicalAddress = AcpiOsMapMemory (Address, MapLength); 193db2bae30SDana Myers if (!MemInfo->MappedLogicalAddress) 194db2bae30SDana Myers { 195db2bae30SDana Myers ACPI_ERROR ((AE_INFO, 19626f3cdf0SGordon Ross "Could not map memory at 0x%8.8X%8.8X, size %u", 197*385cc6b4SJerry Jelinek ACPI_FORMAT_UINT64 (Address), (UINT32) MapLength)); 198db2bae30SDana Myers MemInfo->MappedLength = 0; 199db2bae30SDana Myers return_ACPI_STATUS (AE_NO_MEMORY); 200db2bae30SDana Myers } 201db2bae30SDana Myers 202db2bae30SDana Myers /* Save the physical address and mapping size */ 203db2bae30SDana Myers 204db2bae30SDana Myers MemInfo->MappedPhysicalAddress = Address; 20557190917SDana Myers MemInfo->MappedLength = MapLength; 206db2bae30SDana Myers } 207db2bae30SDana Myers 208db2bae30SDana Myers /* 209db2bae30SDana Myers * Generate a logical pointer corresponding to the address we want to 210db2bae30SDana Myers * access 211db2bae30SDana Myers */ 212db2bae30SDana Myers LogicalAddrPtr = MemInfo->MappedLogicalAddress + 21326f3cdf0SGordon Ross ((UINT64) Address - (UINT64) MemInfo->MappedPhysicalAddress); 214db2bae30SDana Myers 215db2bae30SDana Myers ACPI_DEBUG_PRINT ((ACPI_DB_INFO, 21626f3cdf0SGordon Ross "System-Memory (width %u) R/W %u Address=%8.8X%8.8X\n", 217*385cc6b4SJerry Jelinek BitWidth, Function, ACPI_FORMAT_UINT64 (Address))); 218db2bae30SDana Myers 219db2bae30SDana Myers /* 220db2bae30SDana Myers * Perform the memory read or write 221db2bae30SDana Myers * 222db2bae30SDana Myers * Note: For machines that do not support non-aligned transfers, the target 223db2bae30SDana Myers * address was checked for alignment above. We do not attempt to break the 224db2bae30SDana Myers * transfer up into smaller (byte-size) chunks because the AML specifically 225db2bae30SDana Myers * asked for a transfer width that the hardware may require. 226db2bae30SDana Myers */ 227db2bae30SDana Myers switch (Function) 228db2bae30SDana Myers { 229db2bae30SDana Myers case ACPI_READ: 230db2bae30SDana Myers 231db2bae30SDana Myers *Value = 0; 232db2bae30SDana Myers switch (BitWidth) 233db2bae30SDana Myers { 234db2bae30SDana Myers case 8: 235*385cc6b4SJerry Jelinek 23626f3cdf0SGordon Ross *Value = (UINT64) ACPI_GET8 (LogicalAddrPtr); 237db2bae30SDana Myers break; 238db2bae30SDana Myers 239db2bae30SDana Myers case 16: 240*385cc6b4SJerry Jelinek 24126f3cdf0SGordon Ross *Value = (UINT64) ACPI_GET16 (LogicalAddrPtr); 242db2bae30SDana Myers break; 243db2bae30SDana Myers 244db2bae30SDana Myers case 32: 245*385cc6b4SJerry Jelinek 24626f3cdf0SGordon Ross *Value = (UINT64) ACPI_GET32 (LogicalAddrPtr); 247db2bae30SDana Myers break; 248db2bae30SDana Myers 249db2bae30SDana Myers case 64: 250*385cc6b4SJerry Jelinek 25126f3cdf0SGordon Ross *Value = (UINT64) ACPI_GET64 (LogicalAddrPtr); 252db2bae30SDana Myers break; 253db2bae30SDana Myers 254db2bae30SDana Myers default: 255*385cc6b4SJerry Jelinek 256db2bae30SDana Myers /* BitWidth was already validated */ 257*385cc6b4SJerry Jelinek 258db2bae30SDana Myers break; 259db2bae30SDana Myers } 260db2bae30SDana Myers break; 261db2bae30SDana Myers 262db2bae30SDana Myers case ACPI_WRITE: 263db2bae30SDana Myers 264db2bae30SDana Myers switch (BitWidth) 265db2bae30SDana Myers { 266db2bae30SDana Myers case 8: 267*385cc6b4SJerry Jelinek 268*385cc6b4SJerry Jelinek ACPI_SET8 (LogicalAddrPtr, *Value); 269db2bae30SDana Myers break; 270db2bae30SDana Myers 271db2bae30SDana Myers case 16: 272*385cc6b4SJerry Jelinek 273*385cc6b4SJerry Jelinek ACPI_SET16 (LogicalAddrPtr, *Value); 274db2bae30SDana Myers break; 275db2bae30SDana Myers 276db2bae30SDana Myers case 32: 277*385cc6b4SJerry Jelinek 278*385cc6b4SJerry Jelinek ACPI_SET32 (LogicalAddrPtr, *Value); 279db2bae30SDana Myers break; 280db2bae30SDana Myers 281db2bae30SDana Myers case 64: 282*385cc6b4SJerry Jelinek 283*385cc6b4SJerry Jelinek ACPI_SET64 (LogicalAddrPtr, *Value); 284db2bae30SDana Myers break; 285db2bae30SDana Myers 286db2bae30SDana Myers default: 287*385cc6b4SJerry Jelinek 288db2bae30SDana Myers /* BitWidth was already validated */ 289*385cc6b4SJerry Jelinek 290db2bae30SDana Myers break; 291db2bae30SDana Myers } 292db2bae30SDana Myers break; 293db2bae30SDana Myers 294db2bae30SDana Myers default: 295*385cc6b4SJerry Jelinek 296db2bae30SDana Myers Status = AE_BAD_PARAMETER; 297db2bae30SDana Myers break; 298db2bae30SDana Myers } 299db2bae30SDana Myers 300db2bae30SDana Myers return_ACPI_STATUS (Status); 301db2bae30SDana Myers } 302db2bae30SDana Myers 303db2bae30SDana Myers 304db2bae30SDana Myers /******************************************************************************* 305db2bae30SDana Myers * 306db2bae30SDana Myers * FUNCTION: AcpiExSystemIoSpaceHandler 307db2bae30SDana Myers * 308db2bae30SDana Myers * PARAMETERS: Function - Read or Write operation 309db2bae30SDana Myers * Address - Where in the space to read or write 310db2bae30SDana Myers * BitWidth - Field width in bits (8, 16, or 32) 311db2bae30SDana Myers * Value - Pointer to in or out value 312db2bae30SDana Myers * HandlerContext - Pointer to Handler's context 313db2bae30SDana Myers * RegionContext - Pointer to context specific to the 314db2bae30SDana Myers * accessed region 315db2bae30SDana Myers * 316db2bae30SDana Myers * RETURN: Status 317db2bae30SDana Myers * 318db2bae30SDana Myers * DESCRIPTION: Handler for the System IO address space (Op Region) 319db2bae30SDana Myers * 320db2bae30SDana Myers ******************************************************************************/ 321db2bae30SDana Myers 322db2bae30SDana Myers ACPI_STATUS 323db2bae30SDana Myers AcpiExSystemIoSpaceHandler ( 324db2bae30SDana Myers UINT32 Function, 325db2bae30SDana Myers ACPI_PHYSICAL_ADDRESS Address, 326db2bae30SDana Myers UINT32 BitWidth, 32726f3cdf0SGordon Ross UINT64 *Value, 328db2bae30SDana Myers void *HandlerContext, 329db2bae30SDana Myers void *RegionContext) 330db2bae30SDana Myers { 331db2bae30SDana Myers ACPI_STATUS Status = AE_OK; 332db2bae30SDana Myers UINT32 Value32; 333db2bae30SDana Myers 334db2bae30SDana Myers 335db2bae30SDana Myers ACPI_FUNCTION_TRACE (ExSystemIoSpaceHandler); 336db2bae30SDana Myers 337db2bae30SDana Myers 338db2bae30SDana Myers ACPI_DEBUG_PRINT ((ACPI_DB_INFO, 33926f3cdf0SGordon Ross "System-IO (width %u) R/W %u Address=%8.8X%8.8X\n", 340*385cc6b4SJerry Jelinek BitWidth, Function, ACPI_FORMAT_UINT64 (Address))); 341db2bae30SDana Myers 342db2bae30SDana Myers /* Decode the function parameter */ 343db2bae30SDana Myers 344db2bae30SDana Myers switch (Function) 345db2bae30SDana Myers { 346db2bae30SDana Myers case ACPI_READ: 347db2bae30SDana Myers 348aa2aa9a6SDana Myers Status = AcpiHwReadPort ((ACPI_IO_ADDRESS) Address, 349db2bae30SDana Myers &Value32, BitWidth); 350db2bae30SDana Myers *Value = Value32; 351db2bae30SDana Myers break; 352db2bae30SDana Myers 353db2bae30SDana Myers case ACPI_WRITE: 354db2bae30SDana Myers 355aa2aa9a6SDana Myers Status = AcpiHwWritePort ((ACPI_IO_ADDRESS) Address, 356db2bae30SDana Myers (UINT32) *Value, BitWidth); 357db2bae30SDana Myers break; 358db2bae30SDana Myers 359db2bae30SDana Myers default: 360*385cc6b4SJerry Jelinek 361db2bae30SDana Myers Status = AE_BAD_PARAMETER; 362db2bae30SDana Myers break; 363db2bae30SDana Myers } 364db2bae30SDana Myers 365db2bae30SDana Myers return_ACPI_STATUS (Status); 366db2bae30SDana Myers } 367db2bae30SDana Myers 368db2bae30SDana Myers 369db2bae30SDana Myers /******************************************************************************* 370db2bae30SDana Myers * 371db2bae30SDana Myers * FUNCTION: AcpiExPciConfigSpaceHandler 372db2bae30SDana Myers * 373db2bae30SDana Myers * PARAMETERS: Function - Read or Write operation 374db2bae30SDana Myers * Address - Where in the space to read or write 375db2bae30SDana Myers * BitWidth - Field width in bits (8, 16, or 32) 376db2bae30SDana Myers * Value - Pointer to in or out value 377db2bae30SDana Myers * HandlerContext - Pointer to Handler's context 378db2bae30SDana Myers * RegionContext - Pointer to context specific to the 379db2bae30SDana Myers * accessed region 380db2bae30SDana Myers * 381db2bae30SDana Myers * RETURN: Status 382db2bae30SDana Myers * 383db2bae30SDana Myers * DESCRIPTION: Handler for the PCI Config address space (Op Region) 384db2bae30SDana Myers * 385db2bae30SDana Myers ******************************************************************************/ 386db2bae30SDana Myers 387db2bae30SDana Myers ACPI_STATUS 388db2bae30SDana Myers AcpiExPciConfigSpaceHandler ( 389db2bae30SDana Myers UINT32 Function, 390db2bae30SDana Myers ACPI_PHYSICAL_ADDRESS Address, 391db2bae30SDana Myers UINT32 BitWidth, 39226f3cdf0SGordon Ross UINT64 *Value, 393db2bae30SDana Myers void *HandlerContext, 394db2bae30SDana Myers void *RegionContext) 395db2bae30SDana Myers { 396db2bae30SDana Myers ACPI_STATUS Status = AE_OK; 397db2bae30SDana Myers ACPI_PCI_ID *PciId; 398db2bae30SDana Myers UINT16 PciRegister; 399db2bae30SDana Myers 400db2bae30SDana Myers 401db2bae30SDana Myers ACPI_FUNCTION_TRACE (ExPciConfigSpaceHandler); 402db2bae30SDana Myers 403db2bae30SDana Myers 404db2bae30SDana Myers /* 405db2bae30SDana Myers * The arguments to AcpiOs(Read|Write)PciConfiguration are: 406db2bae30SDana Myers * 407db2bae30SDana Myers * PciSegment is the PCI bus segment range 0-31 408db2bae30SDana Myers * PciBus is the PCI bus number range 0-255 409db2bae30SDana Myers * PciDevice is the PCI device number range 0-31 410db2bae30SDana Myers * PciFunction is the PCI device function number 411db2bae30SDana Myers * PciRegister is the Config space register range 0-255 bytes 412db2bae30SDana Myers * 413db2bae30SDana Myers * Value - input value for write, output address for read 414db2bae30SDana Myers * 415db2bae30SDana Myers */ 416db2bae30SDana Myers PciId = (ACPI_PCI_ID *) RegionContext; 417db2bae30SDana Myers PciRegister = (UINT16) (UINT32) Address; 418db2bae30SDana Myers 419db2bae30SDana Myers ACPI_DEBUG_PRINT ((ACPI_DB_INFO, 420*385cc6b4SJerry Jelinek "Pci-Config %u (%u) Seg(%04x) Bus(%04x) " 421*385cc6b4SJerry Jelinek "Dev(%04x) Func(%04x) Reg(%04x)\n", 422db2bae30SDana Myers Function, BitWidth, PciId->Segment, PciId->Bus, PciId->Device, 423db2bae30SDana Myers PciId->Function, PciRegister)); 424db2bae30SDana Myers 425db2bae30SDana Myers switch (Function) 426db2bae30SDana Myers { 427db2bae30SDana Myers case ACPI_READ: 428db2bae30SDana Myers 429db2bae30SDana Myers *Value = 0; 430*385cc6b4SJerry Jelinek Status = AcpiOsReadPciConfiguration ( 431*385cc6b4SJerry Jelinek PciId, PciRegister, Value, BitWidth); 432db2bae30SDana Myers break; 433db2bae30SDana Myers 434db2bae30SDana Myers case ACPI_WRITE: 435db2bae30SDana Myers 436*385cc6b4SJerry Jelinek Status = AcpiOsWritePciConfiguration ( 437*385cc6b4SJerry Jelinek PciId, PciRegister, *Value, BitWidth); 438db2bae30SDana Myers break; 439db2bae30SDana Myers 440db2bae30SDana Myers default: 441db2bae30SDana Myers 442db2bae30SDana Myers Status = AE_BAD_PARAMETER; 443db2bae30SDana Myers break; 444db2bae30SDana Myers } 445db2bae30SDana Myers 446db2bae30SDana Myers return_ACPI_STATUS (Status); 447db2bae30SDana Myers } 448db2bae30SDana Myers 449db2bae30SDana Myers 450db2bae30SDana Myers /******************************************************************************* 451db2bae30SDana Myers * 452db2bae30SDana Myers * FUNCTION: AcpiExCmosSpaceHandler 453db2bae30SDana Myers * 454db2bae30SDana Myers * PARAMETERS: Function - Read or Write operation 455db2bae30SDana Myers * Address - Where in the space to read or write 456db2bae30SDana Myers * BitWidth - Field width in bits (8, 16, or 32) 457db2bae30SDana Myers * Value - Pointer to in or out value 458db2bae30SDana Myers * HandlerContext - Pointer to Handler's context 459db2bae30SDana Myers * RegionContext - Pointer to context specific to the 460db2bae30SDana Myers * accessed region 461db2bae30SDana Myers * 462db2bae30SDana Myers * RETURN: Status 463db2bae30SDana Myers * 464db2bae30SDana Myers * DESCRIPTION: Handler for the CMOS address space (Op Region) 465db2bae30SDana Myers * 466db2bae30SDana Myers ******************************************************************************/ 467db2bae30SDana Myers 468db2bae30SDana Myers ACPI_STATUS 469db2bae30SDana Myers AcpiExCmosSpaceHandler ( 470db2bae30SDana Myers UINT32 Function, 471db2bae30SDana Myers ACPI_PHYSICAL_ADDRESS Address, 472db2bae30SDana Myers UINT32 BitWidth, 47326f3cdf0SGordon Ross UINT64 *Value, 474db2bae30SDana Myers void *HandlerContext, 475db2bae30SDana Myers void *RegionContext) 476db2bae30SDana Myers { 477db2bae30SDana Myers ACPI_STATUS Status = AE_OK; 478db2bae30SDana Myers 479db2bae30SDana Myers 480db2bae30SDana Myers ACPI_FUNCTION_TRACE (ExCmosSpaceHandler); 481db2bae30SDana Myers 482db2bae30SDana Myers 483db2bae30SDana Myers return_ACPI_STATUS (Status); 484db2bae30SDana Myers } 485db2bae30SDana Myers 486db2bae30SDana Myers 487db2bae30SDana Myers /******************************************************************************* 488db2bae30SDana Myers * 489db2bae30SDana Myers * FUNCTION: AcpiExPciBarSpaceHandler 490db2bae30SDana Myers * 491db2bae30SDana Myers * PARAMETERS: Function - Read or Write operation 492db2bae30SDana Myers * Address - Where in the space to read or write 493db2bae30SDana Myers * BitWidth - Field width in bits (8, 16, or 32) 494db2bae30SDana Myers * Value - Pointer to in or out value 495db2bae30SDana Myers * HandlerContext - Pointer to Handler's context 496db2bae30SDana Myers * RegionContext - Pointer to context specific to the 497db2bae30SDana Myers * accessed region 498db2bae30SDana Myers * 499db2bae30SDana Myers * RETURN: Status 500db2bae30SDana Myers * 501db2bae30SDana Myers * DESCRIPTION: Handler for the PCI BarTarget address space (Op Region) 502db2bae30SDana Myers * 503db2bae30SDana Myers ******************************************************************************/ 504db2bae30SDana Myers 505db2bae30SDana Myers ACPI_STATUS 506db2bae30SDana Myers AcpiExPciBarSpaceHandler ( 507db2bae30SDana Myers UINT32 Function, 508db2bae30SDana Myers ACPI_PHYSICAL_ADDRESS Address, 509db2bae30SDana Myers UINT32 BitWidth, 51026f3cdf0SGordon Ross UINT64 *Value, 511db2bae30SDana Myers void *HandlerContext, 512db2bae30SDana Myers void *RegionContext) 513db2bae30SDana Myers { 514db2bae30SDana Myers ACPI_STATUS Status = AE_OK; 515db2bae30SDana Myers 516db2bae30SDana Myers 517db2bae30SDana Myers ACPI_FUNCTION_TRACE (ExPciBarSpaceHandler); 518db2bae30SDana Myers 519db2bae30SDana Myers 520db2bae30SDana Myers return_ACPI_STATUS (Status); 521db2bae30SDana Myers } 522db2bae30SDana Myers 523db2bae30SDana Myers 524db2bae30SDana Myers /******************************************************************************* 525db2bae30SDana Myers * 526db2bae30SDana Myers * FUNCTION: AcpiExDataTableSpaceHandler 527db2bae30SDana Myers * 528db2bae30SDana Myers * PARAMETERS: Function - Read or Write operation 529db2bae30SDana Myers * Address - Where in the space to read or write 530db2bae30SDana Myers * BitWidth - Field width in bits (8, 16, or 32) 531db2bae30SDana Myers * Value - Pointer to in or out value 532db2bae30SDana Myers * HandlerContext - Pointer to Handler's context 533db2bae30SDana Myers * RegionContext - Pointer to context specific to the 534db2bae30SDana Myers * accessed region 535db2bae30SDana Myers * 536db2bae30SDana Myers * RETURN: Status 537db2bae30SDana Myers * 538db2bae30SDana Myers * DESCRIPTION: Handler for the Data Table address space (Op Region) 539db2bae30SDana Myers * 540db2bae30SDana Myers ******************************************************************************/ 541db2bae30SDana Myers 542db2bae30SDana Myers ACPI_STATUS 543db2bae30SDana Myers AcpiExDataTableSpaceHandler ( 544db2bae30SDana Myers UINT32 Function, 545db2bae30SDana Myers ACPI_PHYSICAL_ADDRESS Address, 546db2bae30SDana Myers UINT32 BitWidth, 54726f3cdf0SGordon Ross UINT64 *Value, 548db2bae30SDana Myers void *HandlerContext, 549db2bae30SDana Myers void *RegionContext) 550db2bae30SDana Myers { 551db2bae30SDana Myers ACPI_FUNCTION_TRACE (ExDataTableSpaceHandler); 552db2bae30SDana Myers 553db2bae30SDana Myers 55426f3cdf0SGordon Ross /* 55526f3cdf0SGordon Ross * Perform the memory read or write. The BitWidth was already 55626f3cdf0SGordon Ross * validated. 55726f3cdf0SGordon Ross */ 558db2bae30SDana Myers switch (Function) 559db2bae30SDana Myers { 560db2bae30SDana Myers case ACPI_READ: 561db2bae30SDana Myers 562*385cc6b4SJerry Jelinek memcpy (ACPI_CAST_PTR (char, Value), ACPI_PHYSADDR_TO_PTR (Address), 563db2bae30SDana Myers ACPI_DIV_8 (BitWidth)); 564db2bae30SDana Myers break; 565db2bae30SDana Myers 566db2bae30SDana Myers case ACPI_WRITE: 56726f3cdf0SGordon Ross 568*385cc6b4SJerry Jelinek memcpy (ACPI_PHYSADDR_TO_PTR (Address), ACPI_CAST_PTR (char, Value), 56926f3cdf0SGordon Ross ACPI_DIV_8 (BitWidth)); 57026f3cdf0SGordon Ross break; 57126f3cdf0SGordon Ross 572db2bae30SDana Myers default: 573db2bae30SDana Myers 57426f3cdf0SGordon Ross return_ACPI_STATUS (AE_BAD_PARAMETER); 575db2bae30SDana Myers } 576db2bae30SDana Myers 577db2bae30SDana Myers return_ACPI_STATUS (AE_OK); 578db2bae30SDana Myers } 579