xref: /openbmc/linux/drivers/acpi/acpica/rsirq.c (revision c163f90c)
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