167754Smsmith/******************************************************************************* 267754Smsmith * 377424Smsmith * Module Name: rsaddr - Address resource descriptors (16/32/64) 467754Smsmith * 567754Smsmith ******************************************************************************/ 667754Smsmith 7217365Sjkim/* 8306536Sjkim * Copyright (C) 2000 - 2016, Intel Corp. 970243Smsmith * All rights reserved. 1067754Smsmith * 11217365Sjkim * Redistribution and use in source and binary forms, with or without 12217365Sjkim * modification, are permitted provided that the following conditions 13217365Sjkim * are met: 14217365Sjkim * 1. Redistributions of source code must retain the above copyright 15217365Sjkim * notice, this list of conditions, and the following disclaimer, 16217365Sjkim * without modification. 17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18217365Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 19217365Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 20217365Sjkim * including a substantially similar Disclaimer requirement for further 21217365Sjkim * binary redistribution. 22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 23217365Sjkim * of any contributors may be used to endorse or promote products derived 24217365Sjkim * from this software without specific prior written permission. 2567754Smsmith * 26217365Sjkim * Alternatively, this software may be distributed under the terms of the 27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 28217365Sjkim * Software Foundation. 2967754Smsmith * 30217365Sjkim * NO WARRANTY 31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41217365Sjkim * POSSIBILITY OF SUCH DAMAGES. 42217365Sjkim */ 4367754Smsmith 44193341Sjkim#include <contrib/dev/acpica/include/acpi.h> 45193341Sjkim#include <contrib/dev/acpica/include/accommon.h> 46193341Sjkim#include <contrib/dev/acpica/include/acresrc.h> 4767754Smsmith 4877424Smsmith#define _COMPONENT ACPI_RESOURCES 4991116Smsmith ACPI_MODULE_NAME ("rsaddr") 5067754Smsmith 5167754Smsmith 5267754Smsmith/******************************************************************************* 5367754Smsmith * 54151937Sjkim * AcpiRsConvertAddress16 - All WORD (16-bit) address resources 5567754Smsmith * 5667754Smsmith ******************************************************************************/ 5767754Smsmith 58151937SjkimACPI_RSCONVERT_INFO AcpiRsConvertAddress16[5] = 5967754Smsmith{ 60151937Sjkim {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_ADDRESS16, 61151937Sjkim ACPI_RS_SIZE (ACPI_RESOURCE_ADDRESS16), 62151937Sjkim ACPI_RSC_TABLE_SIZE (AcpiRsConvertAddress16)}, 6367754Smsmith 64151937Sjkim {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS16, 65151937Sjkim sizeof (AML_RESOURCE_ADDRESS16), 66151937Sjkim 0}, 6767754Smsmith 68151937Sjkim /* Resource Type, General Flags, and Type-Specific Flags */ 6967754Smsmith 70151937Sjkim {ACPI_RSC_ADDRESS, 0, 0, 0}, 71128212Snjl 7267754Smsmith /* 73151937Sjkim * These fields are contiguous in both the source and destination: 74151937Sjkim * Address Granularity 75151937Sjkim * Address Range Minimum 76151937Sjkim * Address Range Maximum 77151937Sjkim * Address Translation Offset 78151937Sjkim * Address Length 7967754Smsmith */ 80281687Sjkim {ACPI_RSC_MOVE16, ACPI_RS_OFFSET (Data.Address16.Address.Granularity), 81151937Sjkim AML_OFFSET (Address16.Granularity), 82151937Sjkim 5}, 8367754Smsmith 84151937Sjkim /* Optional ResourceSource (Index and String) */ 85123315Snjl 86151937Sjkim {ACPI_RSC_SOURCE, ACPI_RS_OFFSET (Data.Address16.ResourceSource), 87151937Sjkim 0, 88151937Sjkim sizeof (AML_RESOURCE_ADDRESS16)} 89151937Sjkim}; 90120239Snjl 9167754Smsmith 92151937Sjkim/******************************************************************************* 93151937Sjkim * 94151937Sjkim * AcpiRsConvertAddress32 - All DWORD (32-bit) address resources 95151937Sjkim * 96151937Sjkim ******************************************************************************/ 9767754Smsmith 98151937SjkimACPI_RSCONVERT_INFO AcpiRsConvertAddress32[5] = 99151937Sjkim{ 100151937Sjkim {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_ADDRESS32, 101151937Sjkim ACPI_RS_SIZE (ACPI_RESOURCE_ADDRESS32), 102151937Sjkim ACPI_RSC_TABLE_SIZE (AcpiRsConvertAddress32)}, 10387031Smsmith 104151937Sjkim {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS32, 105151937Sjkim sizeof (AML_RESOURCE_ADDRESS32), 106151937Sjkim 0}, 10767754Smsmith 108151937Sjkim /* Resource Type, General Flags, and Type-Specific Flags */ 10967754Smsmith 110151937Sjkim {ACPI_RSC_ADDRESS, 0, 0, 0}, 11167754Smsmith 11267754Smsmith /* 113151937Sjkim * These fields are contiguous in both the source and destination: 114151937Sjkim * Address Granularity 115151937Sjkim * Address Range Minimum 116151937Sjkim * Address Range Maximum 117151937Sjkim * Address Translation Offset 118151937Sjkim * Address Length 11967754Smsmith */ 120281687Sjkim {ACPI_RSC_MOVE32, ACPI_RS_OFFSET (Data.Address32.Address.Granularity), 121151937Sjkim AML_OFFSET (Address32.Granularity), 122151937Sjkim 5}, 12367754Smsmith 124151937Sjkim /* Optional ResourceSource (Index and String) */ 12567754Smsmith 126151937Sjkim {ACPI_RSC_SOURCE, ACPI_RS_OFFSET (Data.Address32.ResourceSource), 127151937Sjkim 0, 128151937Sjkim sizeof (AML_RESOURCE_ADDRESS32)} 129151937Sjkim}; 13067754Smsmith 13167754Smsmith 13267754Smsmith/******************************************************************************* 13367754Smsmith * 134151937Sjkim * AcpiRsConvertAddress64 - All QWORD (64-bit) address resources 13567754Smsmith * 13667754Smsmith ******************************************************************************/ 13767754Smsmith 138151937SjkimACPI_RSCONVERT_INFO AcpiRsConvertAddress64[5] = 13967754Smsmith{ 140151937Sjkim {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_ADDRESS64, 141151937Sjkim ACPI_RS_SIZE (ACPI_RESOURCE_ADDRESS64), 142151937Sjkim ACPI_RSC_TABLE_SIZE (AcpiRsConvertAddress64)}, 14367754Smsmith 144151937Sjkim {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS64, 145151937Sjkim sizeof (AML_RESOURCE_ADDRESS64), 146151937Sjkim 0}, 14767754Smsmith 148151937Sjkim /* Resource Type, General Flags, and Type-Specific Flags */ 14967754Smsmith 150151937Sjkim {ACPI_RSC_ADDRESS, 0, 0, 0}, 15177424Smsmith 15267754Smsmith /* 153151937Sjkim * These fields are contiguous in both the source and destination: 154151937Sjkim * Address Granularity 155151937Sjkim * Address Range Minimum 156151937Sjkim * Address Range Maximum 157151937Sjkim * Address Translation Offset 158151937Sjkim * Address Length 15967754Smsmith */ 160281687Sjkim {ACPI_RSC_MOVE64, ACPI_RS_OFFSET (Data.Address64.Address.Granularity), 161151937Sjkim AML_OFFSET (Address64.Granularity), 162151937Sjkim 5}, 16367754Smsmith 164151937Sjkim /* Optional ResourceSource (Index and String) */ 16567754Smsmith 166151937Sjkim {ACPI_RSC_SOURCE, ACPI_RS_OFFSET (Data.Address64.ResourceSource), 167151937Sjkim 0, 168151937Sjkim sizeof (AML_RESOURCE_ADDRESS64)} 169151937Sjkim}; 17067754Smsmith 17167754Smsmith 172151937Sjkim/******************************************************************************* 173151937Sjkim * 174151937Sjkim * AcpiRsConvertExtAddress64 - All Extended (64-bit) address resources 175151937Sjkim * 176151937Sjkim ******************************************************************************/ 17767754Smsmith 178151937SjkimACPI_RSCONVERT_INFO AcpiRsConvertExtAddress64[5] = 179151937Sjkim{ 180151937Sjkim {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64, 181151937Sjkim ACPI_RS_SIZE (ACPI_RESOURCE_EXTENDED_ADDRESS64), 182151937Sjkim ACPI_RSC_TABLE_SIZE (AcpiRsConvertExtAddress64)}, 18367754Smsmith 184151937Sjkim {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64, 185151937Sjkim sizeof (AML_RESOURCE_EXTENDED_ADDRESS64), 186151937Sjkim 0}, 18767754Smsmith 188151937Sjkim /* Resource Type, General Flags, and Type-Specific Flags */ 18967754Smsmith 190151937Sjkim {ACPI_RSC_ADDRESS, 0, 0, 0}, 19167754Smsmith 192151937Sjkim /* Revision ID */ 19367754Smsmith 194151937Sjkim {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.ExtAddress64.RevisionID), 195151937Sjkim AML_OFFSET (ExtAddress64.RevisionID), 196151937Sjkim 1}, 19767754Smsmith /* 198151937Sjkim * These fields are contiguous in both the source and destination: 199151937Sjkim * Address Granularity 200151937Sjkim * Address Range Minimum 201151937Sjkim * Address Range Maximum 202151937Sjkim * Address Translation Offset 203151937Sjkim * Address Length 204151937Sjkim * Type-Specific Attribute 20567754Smsmith */ 206281687Sjkim {ACPI_RSC_MOVE64, ACPI_RS_OFFSET (Data.ExtAddress64.Address.Granularity), 207151937Sjkim AML_OFFSET (ExtAddress64.Granularity), 208151937Sjkim 6} 209151937Sjkim}; 21067754Smsmith 21167754Smsmith 212151937Sjkim/******************************************************************************* 213151937Sjkim * 214151937Sjkim * AcpiRsConvertGeneralFlags - Flags common to all address descriptors 215151937Sjkim * 216151937Sjkim ******************************************************************************/ 21767754Smsmith 218151937Sjkimstatic ACPI_RSCONVERT_INFO AcpiRsConvertGeneralFlags[6] = 219151937Sjkim{ 220151937Sjkim {ACPI_RSC_FLAGINIT, 0, AML_OFFSET (Address.Flags), 221151937Sjkim ACPI_RSC_TABLE_SIZE (AcpiRsConvertGeneralFlags)}, 22267754Smsmith 223151937Sjkim /* Resource Type (Memory, Io, BusNumber, etc.) */ 22467754Smsmith 225151937Sjkim {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.Address.ResourceType), 226151937Sjkim AML_OFFSET (Address.ResourceType), 227151937Sjkim 1}, 22867754Smsmith 229151937Sjkim /* General Flags - Consume, Decode, MinFixed, MaxFixed */ 23067754Smsmith 231151937Sjkim {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Address.ProducerConsumer), 232151937Sjkim AML_OFFSET (Address.Flags), 233151937Sjkim 0}, 23467754Smsmith 235151937Sjkim {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Address.Decode), 236151937Sjkim AML_OFFSET (Address.Flags), 237151937Sjkim 1}, 23867754Smsmith 239151937Sjkim {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Address.MinAddressFixed), 240151937Sjkim AML_OFFSET (Address.Flags), 241151937Sjkim 2}, 24267754Smsmith 243151937Sjkim {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Address.MaxAddressFixed), 244151937Sjkim AML_OFFSET (Address.Flags), 245151937Sjkim 3} 246151937Sjkim}; 24767754Smsmith 24867754Smsmith 24967754Smsmith/******************************************************************************* 25067754Smsmith * 251151937Sjkim * AcpiRsConvertMemFlags - Flags common to Memory address descriptors 25267754Smsmith * 25367754Smsmith ******************************************************************************/ 25467754Smsmith 255151937Sjkimstatic ACPI_RSCONVERT_INFO AcpiRsConvertMemFlags[5] = 25667754Smsmith{ 257151937Sjkim {ACPI_RSC_FLAGINIT, 0, AML_OFFSET (Address.SpecificFlags), 258151937Sjkim ACPI_RSC_TABLE_SIZE (AcpiRsConvertMemFlags)}, 25967754Smsmith 260151937Sjkim /* Memory-specific flags */ 26167754Smsmith 262151937Sjkim {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Address.Info.Mem.WriteProtect), 263151937Sjkim AML_OFFSET (Address.SpecificFlags), 264151937Sjkim 0}, 26567754Smsmith 266151937Sjkim {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Address.Info.Mem.Caching), 267151937Sjkim AML_OFFSET (Address.SpecificFlags), 268151937Sjkim 1}, 26977424Smsmith 270151937Sjkim {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Address.Info.Mem.RangeType), 271151937Sjkim AML_OFFSET (Address.SpecificFlags), 272151937Sjkim 3}, 27367754Smsmith 274151937Sjkim {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Address.Info.Mem.Translation), 275151937Sjkim AML_OFFSET (Address.SpecificFlags), 276151937Sjkim 5} 277151937Sjkim}; 278120239Snjl 279123315Snjl 28067754Smsmith/******************************************************************************* 28167754Smsmith * 282151937Sjkim * AcpiRsConvertIoFlags - Flags common to I/O address descriptors 28367754Smsmith * 28467754Smsmith ******************************************************************************/ 28567754Smsmith 286151937Sjkimstatic ACPI_RSCONVERT_INFO AcpiRsConvertIoFlags[4] = 28767754Smsmith{ 288151937Sjkim {ACPI_RSC_FLAGINIT, 0, AML_OFFSET (Address.SpecificFlags), 289151937Sjkim ACPI_RSC_TABLE_SIZE (AcpiRsConvertIoFlags)}, 29067754Smsmith 291151937Sjkim /* I/O-specific flags */ 29267754Smsmith 293151937Sjkim {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Address.Info.Io.RangeType), 294151937Sjkim AML_OFFSET (Address.SpecificFlags), 295151937Sjkim 0}, 29667754Smsmith 297151937Sjkim {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Address.Info.Io.Translation), 298151937Sjkim AML_OFFSET (Address.SpecificFlags), 299151937Sjkim 4}, 30077424Smsmith 301151937Sjkim {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Address.Info.Io.TranslationType), 302151937Sjkim AML_OFFSET (Address.SpecificFlags), 303151937Sjkim 5} 304151937Sjkim}; 30567754Smsmith 30667754Smsmith 30777424Smsmith/******************************************************************************* 30877424Smsmith * 309151937Sjkim * FUNCTION: AcpiRsGetAddressCommon 31077424Smsmith * 311151937Sjkim * PARAMETERS: Resource - Pointer to the internal resource struct 312151937Sjkim * Aml - Pointer to the AML resource descriptor 31377424Smsmith * 314151937Sjkim * RETURN: TRUE if the ResourceType field is OK, FALSE otherwise 31577424Smsmith * 316151937Sjkim * DESCRIPTION: Convert common flag fields from a raw AML resource descriptor 317151937Sjkim * to an internal resource descriptor 31877424Smsmith * 31977424Smsmith ******************************************************************************/ 32077424Smsmith 321151937SjkimBOOLEAN 322151937SjkimAcpiRsGetAddressCommon ( 323151937Sjkim ACPI_RESOURCE *Resource, 324151937Sjkim AML_RESOURCE *Aml) 32577424Smsmith{ 326151937Sjkim ACPI_FUNCTION_ENTRY (); 32777424Smsmith 32877424Smsmith 329151937Sjkim /* Validate the Resource Type */ 33077424Smsmith 331306536Sjkim if ((Aml->Address.ResourceType > 2) && 332306536Sjkim (Aml->Address.ResourceType < 0xC0)) 333123315Snjl { 334151937Sjkim return (FALSE); 335123315Snjl } 336123315Snjl 337151937Sjkim /* Get the Resource Type and General Flags */ 33877424Smsmith 339306536Sjkim (void) AcpiRsConvertAmlToResource ( 340306536Sjkim Resource, Aml, AcpiRsConvertGeneralFlags); 34177424Smsmith 342151937Sjkim /* Get the Type-Specific Flags (Memory and I/O descriptors only) */ 34387031Smsmith 344151937Sjkim if (Resource->Data.Address.ResourceType == ACPI_MEMORY_RANGE) 34577424Smsmith { 346306536Sjkim (void) AcpiRsConvertAmlToResource ( 347306536Sjkim Resource, Aml, AcpiRsConvertMemFlags); 34877424Smsmith } 349151937Sjkim else if (Resource->Data.Address.ResourceType == ACPI_IO_RANGE) 35077424Smsmith { 351306536Sjkim (void) AcpiRsConvertAmlToResource ( 352306536Sjkim Resource, Aml, AcpiRsConvertIoFlags); 35377424Smsmith } 35477424Smsmith else 35577424Smsmith { 356151937Sjkim /* Generic resource type, just grab the TypeSpecific byte */ 35777424Smsmith 358306536Sjkim Resource->Data.Address.Info.TypeSpecific = 359306536Sjkim Aml->Address.SpecificFlags; 36077424Smsmith } 36177424Smsmith 362151937Sjkim return (TRUE); 36367754Smsmith} 36467754Smsmith 36577424Smsmith 36677424Smsmith/******************************************************************************* 36777424Smsmith * 368151937Sjkim * FUNCTION: AcpiRsSetAddressCommon 36977424Smsmith * 370151937Sjkim * PARAMETERS: Aml - Pointer to the AML resource descriptor 371151937Sjkim * Resource - Pointer to the internal resource struct 37277424Smsmith * 373151937Sjkim * RETURN: None 37477424Smsmith * 375151937Sjkim * DESCRIPTION: Convert common flag fields from a resource descriptor to an 376151937Sjkim * AML descriptor 37777424Smsmith * 37877424Smsmith ******************************************************************************/ 37977424Smsmith 380151937Sjkimvoid 381151937SjkimAcpiRsSetAddressCommon ( 382151937Sjkim AML_RESOURCE *Aml, 383151937Sjkim ACPI_RESOURCE *Resource) 38477424Smsmith{ 385151937Sjkim ACPI_FUNCTION_ENTRY (); 38677424Smsmith 38777424Smsmith 388151937Sjkim /* Set the Resource Type and General Flags */ 38977424Smsmith 390306536Sjkim (void) AcpiRsConvertResourceToAml ( 391306536Sjkim Resource, Aml, AcpiRsConvertGeneralFlags); 39277424Smsmith 393151937Sjkim /* Set the Type-Specific Flags (Memory and I/O descriptors only) */ 39477424Smsmith 395151937Sjkim if (Resource->Data.Address.ResourceType == ACPI_MEMORY_RANGE) 39677424Smsmith { 397306536Sjkim (void) AcpiRsConvertResourceToAml ( 398306536Sjkim Resource, Aml, AcpiRsConvertMemFlags); 39977424Smsmith } 400151937Sjkim else if (Resource->Data.Address.ResourceType == ACPI_IO_RANGE) 40177424Smsmith { 402306536Sjkim (void) AcpiRsConvertResourceToAml ( 403306536Sjkim Resource, Aml, AcpiRsConvertIoFlags); 40477424Smsmith } 405151937Sjkim else 40677424Smsmith { 407151937Sjkim /* Generic resource type, just copy the TypeSpecific byte */ 40877424Smsmith 409306536Sjkim Aml->Address.SpecificFlags = 410306536Sjkim Resource->Data.Address.Info.TypeSpecific; 41177424Smsmith } 412151937Sjkim} 413