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