aslmapenter.c revision 272444
1272286Sjkim/******************************************************************************
2272286Sjkim *
3272286Sjkim * Module Name: aslmapenter - Build resource descriptor/device maps
4272286Sjkim *
5272286Sjkim *****************************************************************************/
6272286Sjkim
7272286Sjkim/*
8272286Sjkim * Copyright (C) 2000 - 2014, Intel Corp.
9272286Sjkim * All rights reserved.
10272286Sjkim *
11272286Sjkim * Redistribution and use in source and binary forms, with or without
12272286Sjkim * modification, are permitted provided that the following conditions
13272286Sjkim * are met:
14272286Sjkim * 1. Redistributions of source code must retain the above copyright
15272286Sjkim *    notice, this list of conditions, and the following disclaimer,
16272286Sjkim *    without modification.
17272286Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18272286Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19272286Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20272286Sjkim *    including a substantially similar Disclaimer requirement for further
21272286Sjkim *    binary redistribution.
22272286Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23272286Sjkim *    of any contributors may be used to endorse or promote products derived
24272286Sjkim *    from this software without specific prior written permission.
25272286Sjkim *
26272286Sjkim * Alternatively, this software may be distributed under the terms of the
27272286Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28272286Sjkim * Software Foundation.
29272286Sjkim *
30272286Sjkim * NO WARRANTY
31272286Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32272286Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33272286Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34272286Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35272286Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36272286Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37272286Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38272286Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39272286Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40272286Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41272286Sjkim * POSSIBILITY OF SUCH DAMAGES.
42272286Sjkim */
43272286Sjkim
44272444Sjkim#include <contrib/dev/acpica/include/acpi.h>
45272444Sjkim#include <contrib/dev/acpica/include/accommon.h>
46272444Sjkim#include <contrib/dev/acpica/include/acapps.h>
47272444Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h>
48272286Sjkim
49272286Sjkim/* This module used for application-level code only */
50272286Sjkim
51272286Sjkim#define _COMPONENT          ACPI_COMPILER
52272286Sjkim        ACPI_MODULE_NAME    ("aslmapenter")
53272286Sjkim
54272286Sjkim/* Local prototypes */
55272286Sjkim
56272286Sjkimstatic ACPI_GPIO_INFO *
57272286SjkimMpCreateGpioInfo (
58272286Sjkim    UINT16                  PinNumber,
59272286Sjkim    char                    *DeviceName);
60272286Sjkim
61272286Sjkimstatic ACPI_SERIAL_INFO *
62272286SjkimMpCreateSerialInfo (
63272286Sjkim    char                    *DeviceName,
64272286Sjkim    UINT16                  Address);
65272286Sjkim
66272286Sjkim
67272286Sjkim/*******************************************************************************
68272286Sjkim *
69272286Sjkim * FUNCTION:    MpSaveGpioInfo
70272286Sjkim *
71272286Sjkim * PARAMETERS:  Resource                - GPIO resource descriptor
72272286Sjkim *              PinCount                - From GPIO descriptor
73272286Sjkim *              PinList                 - From GPIO descriptor
74272286Sjkim *              DeviceName              - The "ResourceSource" name
75272286Sjkim *
76272286Sjkim * RETURN:      None
77272286Sjkim *
78272286Sjkim * DESCRIPTION: External Interface.
79272286Sjkim *              Save GPIO resource descriptor information.
80272286Sjkim *              Creates new GPIO info blocks, one for each pin defined by the
81272286Sjkim *              GPIO descriptor.
82272286Sjkim *
83272286Sjkim ******************************************************************************/
84272286Sjkim
85272286Sjkimvoid
86272286SjkimMpSaveGpioInfo (
87272286Sjkim    ACPI_PARSE_OBJECT       *Op,
88272286Sjkim    AML_RESOURCE            *Resource,
89272286Sjkim    UINT32                  PinCount,
90272286Sjkim    UINT16                  *PinList,
91272286Sjkim    char                    *DeviceName)
92272286Sjkim{
93272286Sjkim    ACPI_GPIO_INFO          *Info;
94272286Sjkim    UINT32                  i;
95272286Sjkim
96272286Sjkim
97272286Sjkim    /* Mapfile option enabled? */
98272286Sjkim
99272286Sjkim    if (!Gbl_MapfileFlag)
100272286Sjkim    {
101272286Sjkim        return;
102272286Sjkim    }
103272286Sjkim
104272286Sjkim    /* Create an info block for each pin defined in the descriptor */
105272286Sjkim
106272286Sjkim    for (i = 0; i < PinCount; i++)
107272286Sjkim    {
108272286Sjkim        Info = MpCreateGpioInfo (PinList[i], DeviceName);
109272286Sjkim
110272286Sjkim        Info->Op = Op;
111272286Sjkim        Info->DeviceName = DeviceName;
112272286Sjkim        Info->PinCount = PinCount;
113272286Sjkim        Info->PinIndex = i;
114272286Sjkim        Info->PinNumber = PinList[i];
115272286Sjkim        Info->Type = Resource->Gpio.ConnectionType;
116272286Sjkim        Info->Direction = (UINT8) (Resource->Gpio.IntFlags & 0x0003);       /* _IOR, for IO descriptor */
117272286Sjkim        Info->Polarity = (UINT8) ((Resource->Gpio.IntFlags >> 1) & 0x0003); /* _POL, for INT descriptor */
118272286Sjkim    }
119272286Sjkim}
120272286Sjkim
121272286Sjkim
122272286Sjkim/*******************************************************************************
123272286Sjkim *
124272286Sjkim * FUNCTION:    MpSaveSerialInfo
125272286Sjkim *
126272286Sjkim * PARAMETERS:  Resource                - A Serial resource descriptor
127272286Sjkim *              DeviceName              - The "ResourceSource" name.
128272286Sjkim *
129272286Sjkim * RETURN:      None
130272286Sjkim *
131272286Sjkim * DESCRIPTION: External Interface.
132272286Sjkim *              Save serial resource descriptor information.
133272286Sjkim *              Creates a new serial info block.
134272286Sjkim *
135272286Sjkim ******************************************************************************/
136272286Sjkim
137272286Sjkimvoid
138272286SjkimMpSaveSerialInfo (
139272286Sjkim    ACPI_PARSE_OBJECT       *Op,
140272286Sjkim    AML_RESOURCE            *Resource,
141272286Sjkim    char                    *DeviceName)
142272286Sjkim{
143272286Sjkim    ACPI_SERIAL_INFO        *Info;
144272286Sjkim    UINT16                  Address;
145272286Sjkim    UINT32                  Speed;
146272286Sjkim
147272286Sjkim
148272286Sjkim    /* Mapfile option enabled? */
149272286Sjkim
150272286Sjkim    if (!Gbl_MapfileFlag)
151272286Sjkim    {
152272286Sjkim        return;
153272286Sjkim    }
154272286Sjkim
155272286Sjkim    if (Resource->DescriptorType != ACPI_RESOURCE_NAME_SERIAL_BUS)
156272286Sjkim    {
157272286Sjkim        return;
158272286Sjkim    }
159272286Sjkim
160272286Sjkim    /* Extract address and speed from the resource descriptor */
161272286Sjkim
162272286Sjkim    switch (Resource->CommonSerialBus.Type)
163272286Sjkim    {
164272286Sjkim    case AML_RESOURCE_I2C_SERIALBUSTYPE:
165272286Sjkim
166272286Sjkim        Address = Resource->I2cSerialBus.SlaveAddress;
167272286Sjkim        Speed = Resource->I2cSerialBus.ConnectionSpeed;
168272286Sjkim        break;
169272286Sjkim
170272286Sjkim    case AML_RESOURCE_SPI_SERIALBUSTYPE:
171272286Sjkim
172272286Sjkim        Address = Resource->SpiSerialBus.DeviceSelection;
173272286Sjkim        Speed = Resource->SpiSerialBus.ConnectionSpeed;
174272286Sjkim        break;
175272286Sjkim
176272286Sjkim    case AML_RESOURCE_UART_SERIALBUSTYPE:
177272286Sjkim
178272286Sjkim        Address = 0;
179272286Sjkim        Speed = Resource->UartSerialBus.DefaultBaudRate;
180272286Sjkim        break;
181272286Sjkim
182272286Sjkim    default:    /* Invalid bus subtype */
183272286Sjkim        return;
184272286Sjkim    }
185272286Sjkim
186272286Sjkim    Info = MpCreateSerialInfo (DeviceName, Address);
187272286Sjkim
188272286Sjkim    Info->Op = Op;
189272286Sjkim    Info->DeviceName = DeviceName;
190272286Sjkim    Info->Resource = Resource;
191272286Sjkim    Info->Address = Address;
192272286Sjkim    Info->Speed = Speed;
193272286Sjkim}
194272286Sjkim
195272286Sjkim
196272286Sjkim/*******************************************************************************
197272286Sjkim *
198272286Sjkim * FUNCTION:    MpCreateGpioInfo
199272286Sjkim *
200272286Sjkim * PARAMETERS:  PinNumber               - GPIO pin number
201272286Sjkim *              DeviceName              - The "ResourceSource" name
202272286Sjkim *
203272286Sjkim * RETURN:      New GPIO info block.
204272286Sjkim *
205272286Sjkim * DESCRIPTION: Create a new GPIO info block and place it on the global list.
206272286Sjkim *              The list is sorted by GPIO device names first, and pin numbers
207272286Sjkim *              secondarily.
208272286Sjkim *
209272286Sjkim ******************************************************************************/
210272286Sjkim
211272286Sjkimstatic ACPI_GPIO_INFO *
212272286SjkimMpCreateGpioInfo (
213272286Sjkim    UINT16                  PinNumber,
214272286Sjkim    char                    *DeviceName)
215272286Sjkim{
216272286Sjkim    ACPI_GPIO_INFO          *Info;
217272286Sjkim    ACPI_GPIO_INFO          *NextGpio;
218272286Sjkim    ACPI_GPIO_INFO          *PrevGpio;
219272286Sjkim
220272286Sjkim
221272286Sjkim    /*
222272286Sjkim     * Allocate a new info block and insert it into the global GPIO list
223272286Sjkim     * sorted by both source device name and then the pin number. There is
224272286Sjkim     * one block per pin.
225272286Sjkim     */
226272286Sjkim    Info = ACPI_CAST_PTR (ACPI_GPIO_INFO,
227272286Sjkim        UtStringCacheCalloc (sizeof (ACPI_GPIO_INFO)));
228272286Sjkim
229272286Sjkim    NextGpio = Gbl_GpioList;
230272286Sjkim    PrevGpio = NULL;
231272286Sjkim    if (!Gbl_GpioList)
232272286Sjkim    {
233272286Sjkim        Gbl_GpioList = Info;
234272286Sjkim        Info->Next = NULL;
235272286Sjkim        return (Info);
236272286Sjkim    }
237272286Sjkim
238272286Sjkim    /* Sort on source DeviceName first */
239272286Sjkim
240272286Sjkim    while (NextGpio &&
241272286Sjkim            (ACPI_STRCMP (DeviceName, NextGpio->DeviceName) > 0))
242272286Sjkim    {
243272286Sjkim        PrevGpio = NextGpio;
244272286Sjkim        NextGpio = NextGpio->Next;
245272286Sjkim    }
246272286Sjkim
247272286Sjkim    /* Now sort on the PinNumber */
248272286Sjkim
249272286Sjkim    while (NextGpio &&
250272286Sjkim            (NextGpio->PinNumber < PinNumber) &&
251272286Sjkim            !ACPI_STRCMP (DeviceName, NextGpio->DeviceName))
252272286Sjkim    {
253272286Sjkim        PrevGpio = NextGpio;
254272286Sjkim        NextGpio = NextGpio->Next;
255272286Sjkim    }
256272286Sjkim
257272286Sjkim    /* Finish the list insertion */
258272286Sjkim
259272286Sjkim    if (PrevGpio)
260272286Sjkim    {
261272286Sjkim        PrevGpio->Next = Info;
262272286Sjkim    }
263272286Sjkim    else
264272286Sjkim    {
265272286Sjkim        Gbl_GpioList = Info;
266272286Sjkim    }
267272286Sjkim
268272286Sjkim    Info->Next = NextGpio;
269272286Sjkim    return (Info);
270272286Sjkim}
271272286Sjkim
272272286Sjkim
273272286Sjkim/*******************************************************************************
274272286Sjkim *
275272286Sjkim * FUNCTION:    MpCreateSerialInfo
276272286Sjkim *
277272286Sjkim * PARAMETERS:  DeviceName              - The "ResourceSource" name.
278272286Sjkim *              Address                 - Physical address for the device
279272286Sjkim *
280272286Sjkim * RETURN:      New Serial info block.
281272286Sjkim *
282272286Sjkim * DESCRIPTION: Create a new Serial info block and place it on the global list.
283272286Sjkim *              The list is sorted by Serial device names first, and addresses
284272286Sjkim *              secondarily.
285272286Sjkim *
286272286Sjkim ******************************************************************************/
287272286Sjkim
288272286Sjkimstatic ACPI_SERIAL_INFO *
289272286SjkimMpCreateSerialInfo (
290272286Sjkim    char                    *DeviceName,
291272286Sjkim    UINT16                  Address)
292272286Sjkim{
293272286Sjkim    ACPI_SERIAL_INFO        *Info;
294272286Sjkim    ACPI_SERIAL_INFO        *NextSerial;
295272286Sjkim    ACPI_SERIAL_INFO        *PrevSerial;
296272286Sjkim
297272286Sjkim
298272286Sjkim    /*
299272286Sjkim     * Allocate a new info block and insert it into the global Serial list
300272286Sjkim     * sorted by both source device name and then the address.
301272286Sjkim     */
302272286Sjkim    Info = ACPI_CAST_PTR (ACPI_SERIAL_INFO,
303272286Sjkim        UtStringCacheCalloc (sizeof (ACPI_SERIAL_INFO)));
304272286Sjkim
305272286Sjkim    NextSerial = Gbl_SerialList;
306272286Sjkim    PrevSerial = NULL;
307272286Sjkim    if (!Gbl_SerialList)
308272286Sjkim    {
309272286Sjkim        Gbl_SerialList = Info;
310272286Sjkim        Info->Next = NULL;
311272286Sjkim        return (Info);
312272286Sjkim    }
313272286Sjkim
314272286Sjkim    /* Sort on source DeviceName */
315272286Sjkim
316272286Sjkim    while (NextSerial &&
317272286Sjkim        (ACPI_STRCMP (DeviceName, NextSerial->DeviceName) > 0))
318272286Sjkim    {
319272286Sjkim        PrevSerial = NextSerial;
320272286Sjkim        NextSerial = NextSerial->Next;
321272286Sjkim    }
322272286Sjkim
323272286Sjkim    /* Now sort on the Address */
324272286Sjkim
325272286Sjkim    while (NextSerial &&
326272286Sjkim        (NextSerial->Address < Address) &&
327272286Sjkim        !ACPI_STRCMP (DeviceName, NextSerial->DeviceName))
328272286Sjkim    {
329272286Sjkim        PrevSerial = NextSerial;
330272286Sjkim        NextSerial = NextSerial->Next;
331272286Sjkim    }
332272286Sjkim
333272286Sjkim    /* Finish the list insertion */
334272286Sjkim
335272286Sjkim    if (PrevSerial)
336272286Sjkim    {
337272286Sjkim        PrevSerial->Next = Info;
338272286Sjkim    }
339272286Sjkim    else
340272286Sjkim    {
341272286Sjkim        Gbl_SerialList = Info;
342272286Sjkim    }
343272286Sjkim
344272286Sjkim    Info->Next = NextSerial;
345272286Sjkim    return (Info);
346272286Sjkim}
347