rsirq.c revision 306536
160484Sobrien/*******************************************************************************
260484Sobrien *
360484Sobrien * Module Name: rsirq - IRQ resource descriptors
460484Sobrien *
560484Sobrien ******************************************************************************/
660484Sobrien
760484Sobrien/*
860484Sobrien * Copyright (C) 2000 - 2016, Intel Corp.
960484Sobrien * All rights reserved.
1060484Sobrien *
1160484Sobrien * Redistribution and use in source and binary forms, with or without
1260484Sobrien * modification, are permitted provided that the following conditions
1360484Sobrien * are met:
1460484Sobrien * 1. Redistributions of source code must retain the above copyright
1560484Sobrien *    notice, this list of conditions, and the following disclaimer,
1660484Sobrien *    without modification.
1760484Sobrien * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1860484Sobrien *    substantially similar to the "NO WARRANTY" disclaimer below
1960484Sobrien *    ("Disclaimer") and any redistribution must be conditioned upon
2060484Sobrien *    including a substantially similar Disclaimer requirement for further
2160484Sobrien *    binary redistribution.
2260484Sobrien * 3. Neither the names of the above-listed copyright holders nor the names
2360484Sobrien *    of any contributors may be used to endorse or promote products derived
2460484Sobrien *    from this software without specific prior written permission.
2560484Sobrien *
2660484Sobrien * Alternatively, this software may be distributed under the terms of the
2760484Sobrien * GNU General Public License ("GPL") version 2 as published by the Free
2860484Sobrien * Software Foundation.
2960484Sobrien *
3060484Sobrien * NO WARRANTY
3160484Sobrien * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3260484Sobrien * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3360484Sobrien * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
3460484Sobrien * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3560484Sobrien * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
3660484Sobrien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3760484Sobrien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3860484Sobrien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
3960484Sobrien * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
4060484Sobrien * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
4160484Sobrien * POSSIBILITY OF SUCH DAMAGES.
4260484Sobrien */
4360484Sobrien
4460484Sobrien#include <contrib/dev/acpica/include/acpi.h>
4560484Sobrien#include <contrib/dev/acpica/include/accommon.h>
4660484Sobrien#include <contrib/dev/acpica/include/acresrc.h>
4760484Sobrien
4860484Sobrien#define _COMPONENT          ACPI_RESOURCES
4960484Sobrien        ACPI_MODULE_NAME    ("rsirq")
5060484Sobrien
5160484Sobrien
5260484Sobrien/*******************************************************************************
5360484Sobrien *
5460484Sobrien * AcpiRsGetIrq
5560484Sobrien *
5660484Sobrien ******************************************************************************/
5760484Sobrien
5860484SobrienACPI_RSCONVERT_INFO     AcpiRsGetIrq[9] =
5960484Sobrien{
6060484Sobrien    {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_IRQ,
6160484Sobrien                        ACPI_RS_SIZE (ACPI_RESOURCE_IRQ),
6260484Sobrien                        ACPI_RSC_TABLE_SIZE (AcpiRsGetIrq)},
6360484Sobrien
6460484Sobrien    /* Get the IRQ mask (bytes 1:2) */
6560484Sobrien
6660484Sobrien    {ACPI_RSC_BITMASK16,ACPI_RS_OFFSET (Data.Irq.Interrupts[0]),
6760484Sobrien                        AML_OFFSET (Irq.IrqMask),
6860484Sobrien                        ACPI_RS_OFFSET (Data.Irq.InterruptCount)},
6960484Sobrien
7060484Sobrien    /* Set default flags (others are zero) */
7160484Sobrien
7260484Sobrien    {ACPI_RSC_SET8,     ACPI_RS_OFFSET (Data.Irq.Triggering),
7360484Sobrien                        ACPI_EDGE_SENSITIVE,
7460484Sobrien                        1},
7560484Sobrien
7660484Sobrien    /* Get the descriptor length (2 or 3 for IRQ descriptor) */
7760484Sobrien
7860484Sobrien    {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Irq.DescriptorLength),
7960484Sobrien                        AML_OFFSET (Irq.DescriptorType),
8060484Sobrien                        0},
8160484Sobrien
8260484Sobrien    /* All done if no flag byte present in descriptor */
8360484Sobrien
8460484Sobrien    {ACPI_RSC_EXIT_NE,  ACPI_RSC_COMPARE_AML_LENGTH, 0, 3},
8560484Sobrien
8660484Sobrien    /* Get flags: Triggering[0], Polarity[3], Sharing[4], Wake[5] */
8760484Sobrien
8860484Sobrien    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.Triggering),
8960484Sobrien                        AML_OFFSET (Irq.Flags),
9060484Sobrien                        0},
9160484Sobrien
9260484Sobrien    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.Polarity),
9360484Sobrien                        AML_OFFSET (Irq.Flags),
9460484Sobrien                        3},
9560484Sobrien
9660484Sobrien    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.Sharable),
9760484Sobrien                        AML_OFFSET (Irq.Flags),
9860484Sobrien                        4},
9960484Sobrien
10060484Sobrien    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.WakeCapable),
10160484Sobrien                        AML_OFFSET (Irq.Flags),
10260484Sobrien                        5}
10360484Sobrien};
10460484Sobrien
10560484Sobrien
10660484Sobrien/*******************************************************************************
10760484Sobrien *
10860484Sobrien * AcpiRsSetIrq
10960484Sobrien *
11060484Sobrien ******************************************************************************/
11160484Sobrien
11260484SobrienACPI_RSCONVERT_INFO     AcpiRsSetIrq[14] =
11360484Sobrien{
11460484Sobrien    /* Start with a default descriptor of length 3 */
11560484Sobrien
11660484Sobrien    {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_IRQ,
11760484Sobrien                        sizeof (AML_RESOURCE_IRQ),
11860484Sobrien                        ACPI_RSC_TABLE_SIZE (AcpiRsSetIrq)},
11960484Sobrien
12060484Sobrien    /* Convert interrupt list to 16-bit IRQ bitmask */
12160484Sobrien
12260484Sobrien    {ACPI_RSC_BITMASK16,ACPI_RS_OFFSET (Data.Irq.Interrupts[0]),
12360484Sobrien                        AML_OFFSET (Irq.IrqMask),
12460484Sobrien                        ACPI_RS_OFFSET (Data.Irq.InterruptCount)},
12560484Sobrien
12677298Sobrien    /* Set flags: Triggering[0], Polarity[3], Sharing[4], Wake[5] */
12777298Sobrien
12877298Sobrien    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.Triggering),
12977298Sobrien                        AML_OFFSET (Irq.Flags),
13077298Sobrien                        0},
13177298Sobrien
13277298Sobrien    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.Polarity),
13377298Sobrien                        AML_OFFSET (Irq.Flags),
13477298Sobrien                        3},
13577298Sobrien
13677298Sobrien    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.Sharable),
13777298Sobrien                        AML_OFFSET (Irq.Flags),
13877298Sobrien                        4},
13977298Sobrien
14077298Sobrien    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.WakeCapable),
14177298Sobrien                        AML_OFFSET (Irq.Flags),
14277298Sobrien                        5},
14360484Sobrien
14477298Sobrien    /*
14560484Sobrien     * All done if the output descriptor length is required to be 3
14677298Sobrien     * (i.e., optimization to 2 bytes cannot be attempted)
14760484Sobrien     */
14860484Sobrien    {ACPI_RSC_EXIT_EQ,  ACPI_RSC_COMPARE_VALUE,
14960484Sobrien                        ACPI_RS_OFFSET(Data.Irq.DescriptorLength),
15060484Sobrien                        3},
15160484Sobrien
15260484Sobrien    /* Set length to 2 bytes (no flags byte) */
15360484Sobrien
15460484Sobrien    {ACPI_RSC_LENGTH,   0, 0, sizeof (AML_RESOURCE_IRQ_NOFLAGS)},
15560484Sobrien
15660484Sobrien    /*
15760484Sobrien     * All done if the output descriptor length is required to be 2.
15860484Sobrien     *
15960484Sobrien     * TBD: Perhaps we should check for error if input flags are not
16060484Sobrien     * compatible with a 2-byte descriptor.
16160484Sobrien     */
16260484Sobrien    {ACPI_RSC_EXIT_EQ,  ACPI_RSC_COMPARE_VALUE,
16360484Sobrien                        ACPI_RS_OFFSET(Data.Irq.DescriptorLength),
16460484Sobrien                        2},
16560484Sobrien
16660484Sobrien    /* Reset length to 3 bytes (descriptor with flags byte) */
16760484Sobrien
16860484Sobrien    {ACPI_RSC_LENGTH,   0, 0, sizeof (AML_RESOURCE_IRQ)},
16960484Sobrien
17060484Sobrien    /*
17160484Sobrien     * Check if the flags byte is necessary. Not needed if the flags are:
17260484Sobrien     * ACPI_EDGE_SENSITIVE, ACPI_ACTIVE_HIGH, ACPI_EXCLUSIVE
17360484Sobrien     */
17460484Sobrien    {ACPI_RSC_EXIT_NE,  ACPI_RSC_COMPARE_VALUE,
17560484Sobrien                        ACPI_RS_OFFSET (Data.Irq.Triggering),
17660484Sobrien                        ACPI_EDGE_SENSITIVE},
17760484Sobrien
17860484Sobrien    {ACPI_RSC_EXIT_NE,  ACPI_RSC_COMPARE_VALUE,
17960484Sobrien                        ACPI_RS_OFFSET (Data.Irq.Polarity),
18060484Sobrien                        ACPI_ACTIVE_HIGH},
18160484Sobrien
18260484Sobrien    {ACPI_RSC_EXIT_NE,  ACPI_RSC_COMPARE_VALUE,
18360484Sobrien                        ACPI_RS_OFFSET (Data.Irq.Sharable),
18460484Sobrien                        ACPI_EXCLUSIVE},
18560484Sobrien
18660484Sobrien    /* We can optimize to a 2-byte IrqNoFlags() descriptor */
18760484Sobrien
18860484Sobrien    {ACPI_RSC_LENGTH,   0, 0, sizeof (AML_RESOURCE_IRQ_NOFLAGS)}
18960484Sobrien};
19060484Sobrien
19160484Sobrien
19260484Sobrien/*******************************************************************************
19360484Sobrien *
19460484Sobrien * AcpiRsConvertExtIrq
19560484Sobrien *
19660484Sobrien ******************************************************************************/
19760484Sobrien
19860484SobrienACPI_RSCONVERT_INFO     AcpiRsConvertExtIrq[10] =
19960484Sobrien{
20060484Sobrien    {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_EXTENDED_IRQ,
20160484Sobrien                        ACPI_RS_SIZE (ACPI_RESOURCE_EXTENDED_IRQ),
20260484Sobrien                        ACPI_RSC_TABLE_SIZE (AcpiRsConvertExtIrq)},
20360484Sobrien
20460484Sobrien    {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_EXTENDED_IRQ,
20560484Sobrien                        sizeof (AML_RESOURCE_EXTENDED_IRQ),
20660484Sobrien                        0},
20760484Sobrien
20860484Sobrien    /*
20960484Sobrien     * Flags: Producer/Consumer[0], Triggering[1], Polarity[2],
21060484Sobrien     *        Sharing[3], Wake[4]
21160484Sobrien     */
21260484Sobrien    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.ExtendedIrq.ProducerConsumer),
21360484Sobrien                        AML_OFFSET (ExtendedIrq.Flags),
21460484Sobrien                        0},
21560484Sobrien
21660484Sobrien    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.ExtendedIrq.Triggering),
21760484Sobrien                        AML_OFFSET (ExtendedIrq.Flags),
21860484Sobrien                        1},
21960484Sobrien
22060484Sobrien    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.ExtendedIrq.Polarity),
22160484Sobrien                        AML_OFFSET (ExtendedIrq.Flags),
22260484Sobrien                        2},
22360484Sobrien
22460484Sobrien    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.ExtendedIrq.Sharable),
22560484Sobrien                        AML_OFFSET (ExtendedIrq.Flags),
22660484Sobrien                        3},
22760484Sobrien
22860484Sobrien    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.ExtendedIrq.WakeCapable),
22960484Sobrien                        AML_OFFSET (ExtendedIrq.Flags),
23060484Sobrien                        4},
23160484Sobrien
23260484Sobrien    /* IRQ Table length (Byte4) */
23360484Sobrien
23460484Sobrien    {ACPI_RSC_COUNT,    ACPI_RS_OFFSET (Data.ExtendedIrq.InterruptCount),
23560484Sobrien                        AML_OFFSET (ExtendedIrq.InterruptCount),
23660484Sobrien                        sizeof (UINT32)},
23760484Sobrien
23860484Sobrien    /* Copy every IRQ in the table, each is 32 bits */
23977298Sobrien
24060484Sobrien    {ACPI_RSC_MOVE32,   ACPI_RS_OFFSET (Data.ExtendedIrq.Interrupts[0]),
24160484Sobrien                        AML_OFFSET (ExtendedIrq.Interrupts[0]),
24260484Sobrien                        0},
24360484Sobrien
24460484Sobrien    /* Optional ResourceSource (Index and String) */
24560484Sobrien
24660484Sobrien    {ACPI_RSC_SOURCEX,  ACPI_RS_OFFSET (Data.ExtendedIrq.ResourceSource),
24760484Sobrien                        ACPI_RS_OFFSET (Data.ExtendedIrq.Interrupts[0]),
24860484Sobrien                        sizeof (AML_RESOURCE_EXTENDED_IRQ)}
24960484Sobrien};
25060484Sobrien
25160484Sobrien
25260484Sobrien/*******************************************************************************
25360484Sobrien *
25460484Sobrien * AcpiRsConvertDma
25560484Sobrien *
25660484Sobrien ******************************************************************************/
25760484Sobrien
25860484SobrienACPI_RSCONVERT_INFO     AcpiRsConvertDma[6] =
25960484Sobrien{
26060484Sobrien    {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_DMA,
26160484Sobrien                        ACPI_RS_SIZE (ACPI_RESOURCE_DMA),
26260484Sobrien                        ACPI_RSC_TABLE_SIZE (AcpiRsConvertDma)},
26360484Sobrien
26460484Sobrien    {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_DMA,
26560484Sobrien                        sizeof (AML_RESOURCE_DMA),
26660484Sobrien                        0},
26760484Sobrien
26860484Sobrien    /* Flags: transfer preference, bus mastering, channel speed */
26960484Sobrien
27060484Sobrien    {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Dma.Transfer),
27160484Sobrien                        AML_OFFSET (Dma.Flags),
27277298Sobrien                        0},
27360484Sobrien
27460484Sobrien    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Dma.BusMaster),
27560484Sobrien                        AML_OFFSET (Dma.Flags),
27660484Sobrien                        2},
27760484Sobrien
27860484Sobrien    {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Dma.Type),
27960484Sobrien                        AML_OFFSET (Dma.Flags),
28060484Sobrien                        5},
28160484Sobrien
28260484Sobrien    /* DMA channel mask bits */
28360484Sobrien
28460484Sobrien    {ACPI_RSC_BITMASK,  ACPI_RS_OFFSET (Data.Dma.Channels[0]),
28560484Sobrien                        AML_OFFSET (Dma.DmaChannelMask),
28660484Sobrien                        ACPI_RS_OFFSET (Data.Dma.ChannelCount)}
28760484Sobrien};
28860484Sobrien
28960484Sobrien
29060484Sobrien/*******************************************************************************
29160484Sobrien *
29260484Sobrien * AcpiRsConvertFixedDma
29360484Sobrien *
29460484Sobrien ******************************************************************************/
29560484Sobrien
29660484SobrienACPI_RSCONVERT_INFO     AcpiRsConvertFixedDma[4] =
29760484Sobrien{
29860484Sobrien    {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_FIXED_DMA,
29960484Sobrien                        ACPI_RS_SIZE (ACPI_RESOURCE_FIXED_DMA),
30060484Sobrien                        ACPI_RSC_TABLE_SIZE (AcpiRsConvertFixedDma)},
30160484Sobrien
30260484Sobrien    {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_FIXED_DMA,
30360484Sobrien                        sizeof (AML_RESOURCE_FIXED_DMA),
30477298Sobrien                        0},
30560484Sobrien
30660484Sobrien    /*
30760484Sobrien     * These fields are contiguous in both the source and destination:
30860484Sobrien     * RequestLines
30960484Sobrien     * Channels
31060484Sobrien     */
31160484Sobrien    {ACPI_RSC_MOVE16,   ACPI_RS_OFFSET (Data.FixedDma.RequestLines),
31260484Sobrien                        AML_OFFSET (FixedDma.RequestLines),
31360484Sobrien                        2},
31460484Sobrien
31560484Sobrien    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.FixedDma.Width),
31660484Sobrien                        AML_OFFSET (FixedDma.Width),
31760484Sobrien                        1},
31860484Sobrien};
31977298Sobrien