1313a0c13SJung-uk Kim /****************************************************************************** 2313a0c13SJung-uk Kim * 3313a0c13SJung-uk Kim * Module Name: aslmapenter - Build resource descriptor/device maps 4313a0c13SJung-uk Kim * 5313a0c13SJung-uk Kim *****************************************************************************/ 6313a0c13SJung-uk Kim 7313a0c13SJung-uk Kim /* 81c0e1b6dSJung-uk Kim * Copyright (C) 2000 - 2015, Intel Corp. 9313a0c13SJung-uk Kim * All rights reserved. 10313a0c13SJung-uk Kim * 11313a0c13SJung-uk Kim * Redistribution and use in source and binary forms, with or without 12313a0c13SJung-uk Kim * modification, are permitted provided that the following conditions 13313a0c13SJung-uk Kim * are met: 14313a0c13SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15313a0c13SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16313a0c13SJung-uk Kim * without modification. 17313a0c13SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18313a0c13SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19313a0c13SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20313a0c13SJung-uk Kim * including a substantially similar Disclaimer requirement for further 21313a0c13SJung-uk Kim * binary redistribution. 22313a0c13SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23313a0c13SJung-uk Kim * of any contributors may be used to endorse or promote products derived 24313a0c13SJung-uk Kim * from this software without specific prior written permission. 25313a0c13SJung-uk Kim * 26313a0c13SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27313a0c13SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28313a0c13SJung-uk Kim * Software Foundation. 29313a0c13SJung-uk Kim * 30313a0c13SJung-uk Kim * NO WARRANTY 31313a0c13SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32313a0c13SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33313a0c13SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34313a0c13SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35313a0c13SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36313a0c13SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37313a0c13SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38313a0c13SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39313a0c13SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40313a0c13SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41313a0c13SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42313a0c13SJung-uk Kim */ 43313a0c13SJung-uk Kim 44313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 45313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 46313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/acapps.h> 47313a0c13SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 48313a0c13SJung-uk Kim 49313a0c13SJung-uk Kim /* This module used for application-level code only */ 50313a0c13SJung-uk Kim 51313a0c13SJung-uk Kim #define _COMPONENT ACPI_COMPILER 52313a0c13SJung-uk Kim ACPI_MODULE_NAME ("aslmapenter") 53313a0c13SJung-uk Kim 54313a0c13SJung-uk Kim /* Local prototypes */ 55313a0c13SJung-uk Kim 56313a0c13SJung-uk Kim static ACPI_GPIO_INFO * 57313a0c13SJung-uk Kim MpCreateGpioInfo ( 58313a0c13SJung-uk Kim UINT16 PinNumber, 59313a0c13SJung-uk Kim char *DeviceName); 60313a0c13SJung-uk Kim 61313a0c13SJung-uk Kim static ACPI_SERIAL_INFO * 62313a0c13SJung-uk Kim MpCreateSerialInfo ( 63313a0c13SJung-uk Kim char *DeviceName, 64313a0c13SJung-uk Kim UINT16 Address); 65313a0c13SJung-uk Kim 66313a0c13SJung-uk Kim 67313a0c13SJung-uk Kim /******************************************************************************* 68313a0c13SJung-uk Kim * 69313a0c13SJung-uk Kim * FUNCTION: MpSaveGpioInfo 70313a0c13SJung-uk Kim * 71313a0c13SJung-uk Kim * PARAMETERS: Resource - GPIO resource descriptor 72313a0c13SJung-uk Kim * PinCount - From GPIO descriptor 73313a0c13SJung-uk Kim * PinList - From GPIO descriptor 74313a0c13SJung-uk Kim * DeviceName - The "ResourceSource" name 75313a0c13SJung-uk Kim * 76313a0c13SJung-uk Kim * RETURN: None 77313a0c13SJung-uk Kim * 78313a0c13SJung-uk Kim * DESCRIPTION: External Interface. 79313a0c13SJung-uk Kim * Save GPIO resource descriptor information. 80313a0c13SJung-uk Kim * Creates new GPIO info blocks, one for each pin defined by the 81313a0c13SJung-uk Kim * GPIO descriptor. 82313a0c13SJung-uk Kim * 83313a0c13SJung-uk Kim ******************************************************************************/ 84313a0c13SJung-uk Kim 85313a0c13SJung-uk Kim void 86313a0c13SJung-uk Kim MpSaveGpioInfo ( 87313a0c13SJung-uk Kim ACPI_PARSE_OBJECT *Op, 88313a0c13SJung-uk Kim AML_RESOURCE *Resource, 89313a0c13SJung-uk Kim UINT32 PinCount, 90313a0c13SJung-uk Kim UINT16 *PinList, 91313a0c13SJung-uk Kim char *DeviceName) 92313a0c13SJung-uk Kim { 93313a0c13SJung-uk Kim ACPI_GPIO_INFO *Info; 94313a0c13SJung-uk Kim UINT32 i; 95313a0c13SJung-uk Kim 96313a0c13SJung-uk Kim 97313a0c13SJung-uk Kim /* Mapfile option enabled? */ 98313a0c13SJung-uk Kim 99313a0c13SJung-uk Kim if (!Gbl_MapfileFlag) 100313a0c13SJung-uk Kim { 101313a0c13SJung-uk Kim return; 102313a0c13SJung-uk Kim } 103313a0c13SJung-uk Kim 104313a0c13SJung-uk Kim /* Create an info block for each pin defined in the descriptor */ 105313a0c13SJung-uk Kim 106313a0c13SJung-uk Kim for (i = 0; i < PinCount; i++) 107313a0c13SJung-uk Kim { 108313a0c13SJung-uk Kim Info = MpCreateGpioInfo (PinList[i], DeviceName); 109313a0c13SJung-uk Kim 110313a0c13SJung-uk Kim Info->Op = Op; 111313a0c13SJung-uk Kim Info->DeviceName = DeviceName; 112313a0c13SJung-uk Kim Info->PinCount = PinCount; 113313a0c13SJung-uk Kim Info->PinIndex = i; 114313a0c13SJung-uk Kim Info->PinNumber = PinList[i]; 115313a0c13SJung-uk Kim Info->Type = Resource->Gpio.ConnectionType; 116313a0c13SJung-uk Kim Info->Direction = (UINT8) (Resource->Gpio.IntFlags & 0x0003); /* _IOR, for IO descriptor */ 117313a0c13SJung-uk Kim Info->Polarity = (UINT8) ((Resource->Gpio.IntFlags >> 1) & 0x0003); /* _POL, for INT descriptor */ 118313a0c13SJung-uk Kim } 119313a0c13SJung-uk Kim } 120313a0c13SJung-uk Kim 121313a0c13SJung-uk Kim 122313a0c13SJung-uk Kim /******************************************************************************* 123313a0c13SJung-uk Kim * 124313a0c13SJung-uk Kim * FUNCTION: MpSaveSerialInfo 125313a0c13SJung-uk Kim * 126313a0c13SJung-uk Kim * PARAMETERS: Resource - A Serial resource descriptor 127313a0c13SJung-uk Kim * DeviceName - The "ResourceSource" name. 128313a0c13SJung-uk Kim * 129313a0c13SJung-uk Kim * RETURN: None 130313a0c13SJung-uk Kim * 131313a0c13SJung-uk Kim * DESCRIPTION: External Interface. 132313a0c13SJung-uk Kim * Save serial resource descriptor information. 133313a0c13SJung-uk Kim * Creates a new serial info block. 134313a0c13SJung-uk Kim * 135313a0c13SJung-uk Kim ******************************************************************************/ 136313a0c13SJung-uk Kim 137313a0c13SJung-uk Kim void 138313a0c13SJung-uk Kim MpSaveSerialInfo ( 139313a0c13SJung-uk Kim ACPI_PARSE_OBJECT *Op, 140313a0c13SJung-uk Kim AML_RESOURCE *Resource, 141313a0c13SJung-uk Kim char *DeviceName) 142313a0c13SJung-uk Kim { 143313a0c13SJung-uk Kim ACPI_SERIAL_INFO *Info; 144313a0c13SJung-uk Kim UINT16 Address; 145313a0c13SJung-uk Kim UINT32 Speed; 146313a0c13SJung-uk Kim 147313a0c13SJung-uk Kim 148313a0c13SJung-uk Kim /* Mapfile option enabled? */ 149313a0c13SJung-uk Kim 150313a0c13SJung-uk Kim if (!Gbl_MapfileFlag) 151313a0c13SJung-uk Kim { 152313a0c13SJung-uk Kim return; 153313a0c13SJung-uk Kim } 154313a0c13SJung-uk Kim 155313a0c13SJung-uk Kim if (Resource->DescriptorType != ACPI_RESOURCE_NAME_SERIAL_BUS) 156313a0c13SJung-uk Kim { 157313a0c13SJung-uk Kim return; 158313a0c13SJung-uk Kim } 159313a0c13SJung-uk Kim 160313a0c13SJung-uk Kim /* Extract address and speed from the resource descriptor */ 161313a0c13SJung-uk Kim 162313a0c13SJung-uk Kim switch (Resource->CommonSerialBus.Type) 163313a0c13SJung-uk Kim { 164313a0c13SJung-uk Kim case AML_RESOURCE_I2C_SERIALBUSTYPE: 165313a0c13SJung-uk Kim 166313a0c13SJung-uk Kim Address = Resource->I2cSerialBus.SlaveAddress; 167313a0c13SJung-uk Kim Speed = Resource->I2cSerialBus.ConnectionSpeed; 168313a0c13SJung-uk Kim break; 169313a0c13SJung-uk Kim 170313a0c13SJung-uk Kim case AML_RESOURCE_SPI_SERIALBUSTYPE: 171313a0c13SJung-uk Kim 172313a0c13SJung-uk Kim Address = Resource->SpiSerialBus.DeviceSelection; 173313a0c13SJung-uk Kim Speed = Resource->SpiSerialBus.ConnectionSpeed; 174313a0c13SJung-uk Kim break; 175313a0c13SJung-uk Kim 176313a0c13SJung-uk Kim case AML_RESOURCE_UART_SERIALBUSTYPE: 177313a0c13SJung-uk Kim 178313a0c13SJung-uk Kim Address = 0; 179313a0c13SJung-uk Kim Speed = Resource->UartSerialBus.DefaultBaudRate; 180313a0c13SJung-uk Kim break; 181313a0c13SJung-uk Kim 182313a0c13SJung-uk Kim default: /* Invalid bus subtype */ 183313a0c13SJung-uk Kim return; 184313a0c13SJung-uk Kim } 185313a0c13SJung-uk Kim 186313a0c13SJung-uk Kim Info = MpCreateSerialInfo (DeviceName, Address); 187313a0c13SJung-uk Kim 188313a0c13SJung-uk Kim Info->Op = Op; 189313a0c13SJung-uk Kim Info->DeviceName = DeviceName; 190313a0c13SJung-uk Kim Info->Resource = Resource; 191313a0c13SJung-uk Kim Info->Address = Address; 192313a0c13SJung-uk Kim Info->Speed = Speed; 193313a0c13SJung-uk Kim } 194313a0c13SJung-uk Kim 195313a0c13SJung-uk Kim 196313a0c13SJung-uk Kim /******************************************************************************* 197313a0c13SJung-uk Kim * 198313a0c13SJung-uk Kim * FUNCTION: MpCreateGpioInfo 199313a0c13SJung-uk Kim * 200313a0c13SJung-uk Kim * PARAMETERS: PinNumber - GPIO pin number 201313a0c13SJung-uk Kim * DeviceName - The "ResourceSource" name 202313a0c13SJung-uk Kim * 203313a0c13SJung-uk Kim * RETURN: New GPIO info block. 204313a0c13SJung-uk Kim * 205313a0c13SJung-uk Kim * DESCRIPTION: Create a new GPIO info block and place it on the global list. 206313a0c13SJung-uk Kim * The list is sorted by GPIO device names first, and pin numbers 207313a0c13SJung-uk Kim * secondarily. 208313a0c13SJung-uk Kim * 209313a0c13SJung-uk Kim ******************************************************************************/ 210313a0c13SJung-uk Kim 211313a0c13SJung-uk Kim static ACPI_GPIO_INFO * 212313a0c13SJung-uk Kim MpCreateGpioInfo ( 213313a0c13SJung-uk Kim UINT16 PinNumber, 214313a0c13SJung-uk Kim char *DeviceName) 215313a0c13SJung-uk Kim { 216313a0c13SJung-uk Kim ACPI_GPIO_INFO *Info; 217313a0c13SJung-uk Kim ACPI_GPIO_INFO *NextGpio; 218313a0c13SJung-uk Kim ACPI_GPIO_INFO *PrevGpio; 219*7cf3e94aSJung-uk Kim char *Buffer; 220313a0c13SJung-uk Kim 221313a0c13SJung-uk Kim 222313a0c13SJung-uk Kim /* 223313a0c13SJung-uk Kim * Allocate a new info block and insert it into the global GPIO list 224313a0c13SJung-uk Kim * sorted by both source device name and then the pin number. There is 225313a0c13SJung-uk Kim * one block per pin. 226313a0c13SJung-uk Kim */ 227*7cf3e94aSJung-uk Kim Buffer = UtStringCacheCalloc (sizeof (ACPI_GPIO_INFO)); 228*7cf3e94aSJung-uk Kim Info = ACPI_CAST_PTR (ACPI_GPIO_INFO, Buffer); 229313a0c13SJung-uk Kim 230313a0c13SJung-uk Kim NextGpio = Gbl_GpioList; 231313a0c13SJung-uk Kim PrevGpio = NULL; 232313a0c13SJung-uk Kim if (!Gbl_GpioList) 233313a0c13SJung-uk Kim { 234313a0c13SJung-uk Kim Gbl_GpioList = Info; 235313a0c13SJung-uk Kim Info->Next = NULL; 236313a0c13SJung-uk Kim return (Info); 237313a0c13SJung-uk Kim } 238313a0c13SJung-uk Kim 239313a0c13SJung-uk Kim /* Sort on source DeviceName first */ 240313a0c13SJung-uk Kim 241313a0c13SJung-uk Kim while (NextGpio && 242313a0c13SJung-uk Kim (ACPI_STRCMP (DeviceName, NextGpio->DeviceName) > 0)) 243313a0c13SJung-uk Kim { 244313a0c13SJung-uk Kim PrevGpio = NextGpio; 245313a0c13SJung-uk Kim NextGpio = NextGpio->Next; 246313a0c13SJung-uk Kim } 247313a0c13SJung-uk Kim 248313a0c13SJung-uk Kim /* Now sort on the PinNumber */ 249313a0c13SJung-uk Kim 250313a0c13SJung-uk Kim while (NextGpio && 251313a0c13SJung-uk Kim (NextGpio->PinNumber < PinNumber) && 252313a0c13SJung-uk Kim !ACPI_STRCMP (DeviceName, NextGpio->DeviceName)) 253313a0c13SJung-uk Kim { 254313a0c13SJung-uk Kim PrevGpio = NextGpio; 255313a0c13SJung-uk Kim NextGpio = NextGpio->Next; 256313a0c13SJung-uk Kim } 257313a0c13SJung-uk Kim 258313a0c13SJung-uk Kim /* Finish the list insertion */ 259313a0c13SJung-uk Kim 260313a0c13SJung-uk Kim if (PrevGpio) 261313a0c13SJung-uk Kim { 262313a0c13SJung-uk Kim PrevGpio->Next = Info; 263313a0c13SJung-uk Kim } 264313a0c13SJung-uk Kim else 265313a0c13SJung-uk Kim { 266313a0c13SJung-uk Kim Gbl_GpioList = Info; 267313a0c13SJung-uk Kim } 268313a0c13SJung-uk Kim 269313a0c13SJung-uk Kim Info->Next = NextGpio; 270313a0c13SJung-uk Kim return (Info); 271313a0c13SJung-uk Kim } 272313a0c13SJung-uk Kim 273313a0c13SJung-uk Kim 274313a0c13SJung-uk Kim /******************************************************************************* 275313a0c13SJung-uk Kim * 276313a0c13SJung-uk Kim * FUNCTION: MpCreateSerialInfo 277313a0c13SJung-uk Kim * 278313a0c13SJung-uk Kim * PARAMETERS: DeviceName - The "ResourceSource" name. 279313a0c13SJung-uk Kim * Address - Physical address for the device 280313a0c13SJung-uk Kim * 281313a0c13SJung-uk Kim * RETURN: New Serial info block. 282313a0c13SJung-uk Kim * 283313a0c13SJung-uk Kim * DESCRIPTION: Create a new Serial info block and place it on the global list. 284313a0c13SJung-uk Kim * The list is sorted by Serial device names first, and addresses 285313a0c13SJung-uk Kim * secondarily. 286313a0c13SJung-uk Kim * 287313a0c13SJung-uk Kim ******************************************************************************/ 288313a0c13SJung-uk Kim 289313a0c13SJung-uk Kim static ACPI_SERIAL_INFO * 290313a0c13SJung-uk Kim MpCreateSerialInfo ( 291313a0c13SJung-uk Kim char *DeviceName, 292313a0c13SJung-uk Kim UINT16 Address) 293313a0c13SJung-uk Kim { 294313a0c13SJung-uk Kim ACPI_SERIAL_INFO *Info; 295313a0c13SJung-uk Kim ACPI_SERIAL_INFO *NextSerial; 296313a0c13SJung-uk Kim ACPI_SERIAL_INFO *PrevSerial; 297*7cf3e94aSJung-uk Kim char *Buffer; 298313a0c13SJung-uk Kim 299313a0c13SJung-uk Kim 300313a0c13SJung-uk Kim /* 301313a0c13SJung-uk Kim * Allocate a new info block and insert it into the global Serial list 302313a0c13SJung-uk Kim * sorted by both source device name and then the address. 303313a0c13SJung-uk Kim */ 304*7cf3e94aSJung-uk Kim Buffer = UtStringCacheCalloc (sizeof (ACPI_SERIAL_INFO)); 305*7cf3e94aSJung-uk Kim Info = ACPI_CAST_PTR (ACPI_SERIAL_INFO, Buffer); 306313a0c13SJung-uk Kim 307313a0c13SJung-uk Kim NextSerial = Gbl_SerialList; 308313a0c13SJung-uk Kim PrevSerial = NULL; 309313a0c13SJung-uk Kim if (!Gbl_SerialList) 310313a0c13SJung-uk Kim { 311313a0c13SJung-uk Kim Gbl_SerialList = Info; 312313a0c13SJung-uk Kim Info->Next = NULL; 313313a0c13SJung-uk Kim return (Info); 314313a0c13SJung-uk Kim } 315313a0c13SJung-uk Kim 316313a0c13SJung-uk Kim /* Sort on source DeviceName */ 317313a0c13SJung-uk Kim 318313a0c13SJung-uk Kim while (NextSerial && 319313a0c13SJung-uk Kim (ACPI_STRCMP (DeviceName, NextSerial->DeviceName) > 0)) 320313a0c13SJung-uk Kim { 321313a0c13SJung-uk Kim PrevSerial = NextSerial; 322313a0c13SJung-uk Kim NextSerial = NextSerial->Next; 323313a0c13SJung-uk Kim } 324313a0c13SJung-uk Kim 325313a0c13SJung-uk Kim /* Now sort on the Address */ 326313a0c13SJung-uk Kim 327313a0c13SJung-uk Kim while (NextSerial && 328313a0c13SJung-uk Kim (NextSerial->Address < Address) && 329313a0c13SJung-uk Kim !ACPI_STRCMP (DeviceName, NextSerial->DeviceName)) 330313a0c13SJung-uk Kim { 331313a0c13SJung-uk Kim PrevSerial = NextSerial; 332313a0c13SJung-uk Kim NextSerial = NextSerial->Next; 333313a0c13SJung-uk Kim } 334313a0c13SJung-uk Kim 335313a0c13SJung-uk Kim /* Finish the list insertion */ 336313a0c13SJung-uk Kim 337313a0c13SJung-uk Kim if (PrevSerial) 338313a0c13SJung-uk Kim { 339313a0c13SJung-uk Kim PrevSerial->Next = Info; 340313a0c13SJung-uk Kim } 341313a0c13SJung-uk Kim else 342313a0c13SJung-uk Kim { 343313a0c13SJung-uk Kim Gbl_SerialList = Info; 344313a0c13SJung-uk Kim } 345313a0c13SJung-uk Kim 346313a0c13SJung-uk Kim Info->Next = NextSerial; 347313a0c13SJung-uk Kim return (Info); 348313a0c13SJung-uk Kim } 349