195857638SErik Schmauss // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 295b482a8SLen Brown /******************************************************************************* 395b482a8SLen Brown * 495b482a8SLen Brown * Module Name: rsirq - IRQ resource descriptors 595b482a8SLen Brown * 695b482a8SLen Brown ******************************************************************************/ 795b482a8SLen Brown 895b482a8SLen Brown #include <acpi/acpi.h> 9e2f7a777SLen Brown #include "accommon.h" 10e2f7a777SLen Brown #include "acresrc.h" 1195b482a8SLen Brown 1295b482a8SLen Brown #define _COMPONENT ACPI_RESOURCES 1395b482a8SLen Brown ACPI_MODULE_NAME("rsirq") 1495b482a8SLen Brown 1595b482a8SLen Brown /******************************************************************************* 1695b482a8SLen Brown * 1795b482a8SLen Brown * acpi_rs_get_irq 1895b482a8SLen Brown * 1995b482a8SLen Brown ******************************************************************************/ 209cea6249SBob Moore struct acpi_rsconvert_info acpi_rs_get_irq[9] = { 2195b482a8SLen Brown {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_IRQ, 2295b482a8SLen Brown ACPI_RS_SIZE(struct acpi_resource_irq), 2395b482a8SLen Brown ACPI_RSC_TABLE_SIZE(acpi_rs_get_irq)}, 2495b482a8SLen Brown 2595b482a8SLen Brown /* Get the IRQ mask (bytes 1:2) */ 2695b482a8SLen Brown 2795b482a8SLen Brown {ACPI_RSC_BITMASK16, ACPI_RS_OFFSET(data.irq.interrupts[0]), 2895b482a8SLen Brown AML_OFFSET(irq.irq_mask), 2995b482a8SLen Brown ACPI_RS_OFFSET(data.irq.interrupt_count)}, 3095b482a8SLen Brown 3195b482a8SLen Brown /* Set default flags (others are zero) */ 3295b482a8SLen Brown 3395b482a8SLen Brown {ACPI_RSC_SET8, ACPI_RS_OFFSET(data.irq.triggering), 3495b482a8SLen Brown ACPI_EDGE_SENSITIVE, 3595b482a8SLen Brown 1}, 3695b482a8SLen Brown 3795b482a8SLen Brown /* Get the descriptor length (2 or 3 for IRQ descriptor) */ 3895b482a8SLen Brown 3995b482a8SLen Brown {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.irq.descriptor_length), 4095b482a8SLen Brown AML_OFFSET(irq.descriptor_type), 4195b482a8SLen Brown 0}, 4295b482a8SLen Brown 4395b482a8SLen Brown /* All done if no flag byte present in descriptor */ 4495b482a8SLen Brown 4595b482a8SLen Brown {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_AML_LENGTH, 0, 3}, 4695b482a8SLen Brown 479cea6249SBob Moore /* Get flags: Triggering[0], Polarity[3], Sharing[4], Wake[5] */ 4895b482a8SLen Brown 4995b482a8SLen Brown {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.triggering), 5095b482a8SLen Brown AML_OFFSET(irq.flags), 5195b482a8SLen Brown 0}, 5295b482a8SLen Brown 5395b482a8SLen Brown {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.polarity), 5495b482a8SLen Brown AML_OFFSET(irq.flags), 5595b482a8SLen Brown 3}, 5695b482a8SLen Brown 57c163f90cSErik Schmauss {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.shareable), 5895b482a8SLen Brown AML_OFFSET(irq.flags), 599cea6249SBob Moore 4}, 609cea6249SBob Moore 619cea6249SBob Moore {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.wake_capable), 629cea6249SBob Moore AML_OFFSET(irq.flags), 639cea6249SBob Moore 5} 6495b482a8SLen Brown }; 6595b482a8SLen Brown 6695b482a8SLen Brown /******************************************************************************* 6795b482a8SLen Brown * 6895b482a8SLen Brown * acpi_rs_set_irq 6995b482a8SLen Brown * 7095b482a8SLen Brown ******************************************************************************/ 7195b482a8SLen Brown 729cea6249SBob Moore struct acpi_rsconvert_info acpi_rs_set_irq[14] = { 7395b482a8SLen Brown /* Start with a default descriptor of length 3 */ 7495b482a8SLen Brown 7595b482a8SLen Brown {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_IRQ, 7695b482a8SLen Brown sizeof(struct aml_resource_irq), 7795b482a8SLen Brown ACPI_RSC_TABLE_SIZE(acpi_rs_set_irq)}, 7895b482a8SLen Brown 7995b482a8SLen Brown /* Convert interrupt list to 16-bit IRQ bitmask */ 8095b482a8SLen Brown 8195b482a8SLen Brown {ACPI_RSC_BITMASK16, ACPI_RS_OFFSET(data.irq.interrupts[0]), 8295b482a8SLen Brown AML_OFFSET(irq.irq_mask), 8395b482a8SLen Brown ACPI_RS_OFFSET(data.irq.interrupt_count)}, 8495b482a8SLen Brown 859cea6249SBob Moore /* Set flags: Triggering[0], Polarity[3], Sharing[4], Wake[5] */ 8695b482a8SLen Brown 8795b482a8SLen Brown {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.triggering), 8895b482a8SLen Brown AML_OFFSET(irq.flags), 8995b482a8SLen Brown 0}, 9095b482a8SLen Brown 9195b482a8SLen Brown {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.polarity), 9295b482a8SLen Brown AML_OFFSET(irq.flags), 9395b482a8SLen Brown 3}, 9495b482a8SLen Brown 95c163f90cSErik Schmauss {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.shareable), 9695b482a8SLen Brown AML_OFFSET(irq.flags), 9795b482a8SLen Brown 4}, 9895b482a8SLen Brown 999cea6249SBob Moore {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.wake_capable), 1009cea6249SBob Moore AML_OFFSET(irq.flags), 1019cea6249SBob Moore 5}, 1029cea6249SBob Moore 10395b482a8SLen Brown /* 10495b482a8SLen Brown * All done if the output descriptor length is required to be 3 10595b482a8SLen Brown * (i.e., optimization to 2 bytes cannot be attempted) 10695b482a8SLen Brown */ 10795b482a8SLen Brown {ACPI_RSC_EXIT_EQ, ACPI_RSC_COMPARE_VALUE, 10895b482a8SLen Brown ACPI_RS_OFFSET(data.irq.descriptor_length), 10995b482a8SLen Brown 3}, 11095b482a8SLen Brown 11195b482a8SLen Brown /* Set length to 2 bytes (no flags byte) */ 11295b482a8SLen Brown 11395b482a8SLen Brown {ACPI_RSC_LENGTH, 0, 0, sizeof(struct aml_resource_irq_noflags)}, 11495b482a8SLen Brown 11595b482a8SLen Brown /* 11695b482a8SLen Brown * All done if the output descriptor length is required to be 2. 11795b482a8SLen Brown * 11895b482a8SLen Brown * TBD: Perhaps we should check for error if input flags are not 11995b482a8SLen Brown * compatible with a 2-byte descriptor. 12095b482a8SLen Brown */ 12195b482a8SLen Brown {ACPI_RSC_EXIT_EQ, ACPI_RSC_COMPARE_VALUE, 12295b482a8SLen Brown ACPI_RS_OFFSET(data.irq.descriptor_length), 12395b482a8SLen Brown 2}, 12495b482a8SLen Brown 12595b482a8SLen Brown /* Reset length to 3 bytes (descriptor with flags byte) */ 12695b482a8SLen Brown 12795b482a8SLen Brown {ACPI_RSC_LENGTH, 0, 0, sizeof(struct aml_resource_irq)}, 12895b482a8SLen Brown 12995b482a8SLen Brown /* 13095b482a8SLen Brown * Check if the flags byte is necessary. Not needed if the flags are: 13195b482a8SLen Brown * ACPI_EDGE_SENSITIVE, ACPI_ACTIVE_HIGH, ACPI_EXCLUSIVE 13295b482a8SLen Brown */ 13395b482a8SLen Brown {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE, 13495b482a8SLen Brown ACPI_RS_OFFSET(data.irq.triggering), 13595b482a8SLen Brown ACPI_EDGE_SENSITIVE}, 13695b482a8SLen Brown 13795b482a8SLen Brown {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE, 13895b482a8SLen Brown ACPI_RS_OFFSET(data.irq.polarity), 13995b482a8SLen Brown ACPI_ACTIVE_HIGH}, 14095b482a8SLen Brown 14195b482a8SLen Brown {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE, 142c163f90cSErik Schmauss ACPI_RS_OFFSET(data.irq.shareable), 14395b482a8SLen Brown ACPI_EXCLUSIVE}, 14495b482a8SLen Brown 14595b482a8SLen Brown /* We can optimize to a 2-byte irq_no_flags() descriptor */ 14695b482a8SLen Brown 14795b482a8SLen Brown {ACPI_RSC_LENGTH, 0, 0, sizeof(struct aml_resource_irq_noflags)} 14895b482a8SLen Brown }; 14995b482a8SLen Brown 15095b482a8SLen Brown /******************************************************************************* 15195b482a8SLen Brown * 15295b482a8SLen Brown * acpi_rs_convert_ext_irq 15395b482a8SLen Brown * 15495b482a8SLen Brown ******************************************************************************/ 15595b482a8SLen Brown 1569cea6249SBob Moore struct acpi_rsconvert_info acpi_rs_convert_ext_irq[10] = { 15795b482a8SLen Brown {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_EXTENDED_IRQ, 15895b482a8SLen Brown ACPI_RS_SIZE(struct acpi_resource_extended_irq), 15995b482a8SLen Brown ACPI_RSC_TABLE_SIZE(acpi_rs_convert_ext_irq)}, 16095b482a8SLen Brown 16195b482a8SLen Brown {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_EXTENDED_IRQ, 16295b482a8SLen Brown sizeof(struct aml_resource_extended_irq), 16395b482a8SLen Brown 0}, 16495b482a8SLen Brown 165f7b488e2SAaron Lu /* 166f7b488e2SAaron Lu * Flags: Producer/Consumer[0], Triggering[1], Polarity[2], 1679cea6249SBob Moore * Sharing[3], Wake[4] 168f7b488e2SAaron Lu */ 16995b482a8SLen Brown {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.extended_irq.producer_consumer), 17095b482a8SLen Brown AML_OFFSET(extended_irq.flags), 17195b482a8SLen Brown 0}, 17295b482a8SLen Brown 17395b482a8SLen Brown {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.extended_irq.triggering), 17495b482a8SLen Brown AML_OFFSET(extended_irq.flags), 17595b482a8SLen Brown 1}, 17695b482a8SLen Brown 17795b482a8SLen Brown {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.extended_irq.polarity), 17895b482a8SLen Brown AML_OFFSET(extended_irq.flags), 17995b482a8SLen Brown 2}, 18095b482a8SLen Brown 181c163f90cSErik Schmauss {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.extended_irq.shareable), 18295b482a8SLen Brown AML_OFFSET(extended_irq.flags), 18395b482a8SLen Brown 3}, 18495b482a8SLen Brown 1859cea6249SBob Moore {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.extended_irq.wake_capable), 1869cea6249SBob Moore AML_OFFSET(extended_irq.flags), 1879cea6249SBob Moore 4}, 1889cea6249SBob Moore 18995b482a8SLen Brown /* IRQ Table length (Byte4) */ 19095b482a8SLen Brown 19195b482a8SLen Brown {ACPI_RSC_COUNT, ACPI_RS_OFFSET(data.extended_irq.interrupt_count), 19295b482a8SLen Brown AML_OFFSET(extended_irq.interrupt_count), 1933e8214e5SLv Zheng sizeof(u32)}, 19495b482a8SLen Brown 19595b482a8SLen Brown /* Copy every IRQ in the table, each is 32 bits */ 19695b482a8SLen Brown 19795b482a8SLen Brown {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.extended_irq.interrupts[0]), 19895b482a8SLen Brown AML_OFFSET(extended_irq.interrupts[0]), 1993e8214e5SLv Zheng 0}, 20095b482a8SLen Brown 20195b482a8SLen Brown /* Optional resource_source (Index and String) */ 20295b482a8SLen Brown 20395b482a8SLen Brown {ACPI_RSC_SOURCEX, ACPI_RS_OFFSET(data.extended_irq.resource_source), 20495b482a8SLen Brown ACPI_RS_OFFSET(data.extended_irq.interrupts[0]), 20595b482a8SLen Brown sizeof(struct aml_resource_extended_irq)} 20695b482a8SLen Brown }; 20795b482a8SLen Brown 20895b482a8SLen Brown /******************************************************************************* 20995b482a8SLen Brown * 21095b482a8SLen Brown * acpi_rs_convert_dma 21195b482a8SLen Brown * 21295b482a8SLen Brown ******************************************************************************/ 21395b482a8SLen Brown 21495b482a8SLen Brown struct acpi_rsconvert_info acpi_rs_convert_dma[6] = { 21595b482a8SLen Brown {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_DMA, 21695b482a8SLen Brown ACPI_RS_SIZE(struct acpi_resource_dma), 21795b482a8SLen Brown ACPI_RSC_TABLE_SIZE(acpi_rs_convert_dma)}, 21895b482a8SLen Brown 21995b482a8SLen Brown {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_DMA, 22095b482a8SLen Brown sizeof(struct aml_resource_dma), 22195b482a8SLen Brown 0}, 22295b482a8SLen Brown 22395b482a8SLen Brown /* Flags: transfer preference, bus mastering, channel speed */ 22495b482a8SLen Brown 22595b482a8SLen Brown {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.dma.transfer), 22695b482a8SLen Brown AML_OFFSET(dma.flags), 22795b482a8SLen Brown 0}, 22895b482a8SLen Brown 22995b482a8SLen Brown {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.dma.bus_master), 23095b482a8SLen Brown AML_OFFSET(dma.flags), 23195b482a8SLen Brown 2}, 23295b482a8SLen Brown 23395b482a8SLen Brown {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.dma.type), 23495b482a8SLen Brown AML_OFFSET(dma.flags), 23595b482a8SLen Brown 5}, 23695b482a8SLen Brown 23795b482a8SLen Brown /* DMA channel mask bits */ 23895b482a8SLen Brown 23995b482a8SLen Brown {ACPI_RSC_BITMASK, ACPI_RS_OFFSET(data.dma.channels[0]), 24095b482a8SLen Brown AML_OFFSET(dma.dma_channel_mask), 24195b482a8SLen Brown ACPI_RS_OFFSET(data.dma.channel_count)} 24295b482a8SLen Brown }; 243e0fe0a8dSLin Ming 244e0fe0a8dSLin Ming /******************************************************************************* 245e0fe0a8dSLin Ming * 246e0fe0a8dSLin Ming * acpi_rs_convert_fixed_dma 247e0fe0a8dSLin Ming * 248e0fe0a8dSLin Ming ******************************************************************************/ 249e0fe0a8dSLin Ming 250e0fe0a8dSLin Ming struct acpi_rsconvert_info acpi_rs_convert_fixed_dma[4] = { 251e0fe0a8dSLin Ming {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_FIXED_DMA, 252e0fe0a8dSLin Ming ACPI_RS_SIZE(struct acpi_resource_fixed_dma), 253e0fe0a8dSLin Ming ACPI_RSC_TABLE_SIZE(acpi_rs_convert_fixed_dma)}, 254e0fe0a8dSLin Ming 255e0fe0a8dSLin Ming {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_FIXED_DMA, 256e0fe0a8dSLin Ming sizeof(struct aml_resource_fixed_dma), 257e0fe0a8dSLin Ming 0}, 258e0fe0a8dSLin Ming 259e0fe0a8dSLin Ming /* 260e0fe0a8dSLin Ming * These fields are contiguous in both the source and destination: 261e0fe0a8dSLin Ming * request_lines 262e0fe0a8dSLin Ming * Channels 263e0fe0a8dSLin Ming */ 264e0fe0a8dSLin Ming {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.fixed_dma.request_lines), 265e0fe0a8dSLin Ming AML_OFFSET(fixed_dma.request_lines), 266e0fe0a8dSLin Ming 2}, 267e0fe0a8dSLin Ming 268e0fe0a8dSLin Ming {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.fixed_dma.width), 269e0fe0a8dSLin Ming AML_OFFSET(fixed_dma.width), 270e0fe0a8dSLin Ming 1}, 271e0fe0a8dSLin Ming }; 272