1*3498cc97SBin Meng /* 2*3498cc97SBin Meng * Copyright (C) 2013 Google Inc. 3*3498cc97SBin Meng * Copyright (C) 2014 Sage Electronics Engineering, LLC. 4*3498cc97SBin Meng * Copyright (C) 2016 Bin Meng <bmeng.cn@gmail.com> 5*3498cc97SBin Meng * 6*3498cc97SBin Meng * Modified from coreboot src/soc/intel/baytrail/include/soc/irq_helper.h 7*3498cc97SBin Meng * 8*3498cc97SBin Meng * SPDX-License-Identifier: GPL-2.0+ 9*3498cc97SBin Meng */ 10*3498cc97SBin Meng 11*3498cc97SBin Meng /* 12*3498cc97SBin Meng * This file intentionally gets included multiple times, to set pic and apic 13*3498cc97SBin Meng * modes, so should not have guard statements added. 14*3498cc97SBin Meng */ 15*3498cc97SBin Meng 16*3498cc97SBin Meng /* 17*3498cc97SBin Meng * This file will use irqroute.asl and irqroute.h to generate the ACPI IRQ 18*3498cc97SBin Meng * routing for the platform being compiled. 19*3498cc97SBin Meng * 20*3498cc97SBin Meng * This method uses #defines in irqroute.h along with the macros contained 21*3498cc97SBin Meng * in this file to generate an IRQ routing for each PCI device in the system. 22*3498cc97SBin Meng */ 23*3498cc97SBin Meng 24*3498cc97SBin Meng #undef PCI_DEV_PIRQ_ROUTES 25*3498cc97SBin Meng #undef PCI_DEV_PIRQ_ROUTE 26*3498cc97SBin Meng #undef ACPI_DEV_IRQ 27*3498cc97SBin Meng #undef PCIE_BRIDGE_DEV 28*3498cc97SBin Meng #undef RP_IRQ_ROUTES 29*3498cc97SBin Meng #undef ROOTPORT_METHODS 30*3498cc97SBin Meng #undef ROOTPORT_IRQ_ROUTES 31*3498cc97SBin Meng #undef RP_METHOD 32*3498cc97SBin Meng 33*3498cc97SBin Meng #if defined(PIC_MODE) 34*3498cc97SBin Meng 35*3498cc97SBin Meng #define ACPI_DEV_IRQ(dev_, pin_, pin_name_) \ 36*3498cc97SBin Meng Package() { ## dev_ ## ffff, pin_, \_SB.PCI0.LPCB.LNK ## pin_name_, 0 } 37*3498cc97SBin Meng 38*3498cc97SBin Meng #define RP_IRQ_ROUTES(prefix_, func_, a_, b_, c_, d_) \ 39*3498cc97SBin Meng Name(prefix_ ## func_ ## P, Package() \ 40*3498cc97SBin Meng { \ 41*3498cc97SBin Meng ACPI_DEV_IRQ(0x0000, 0, a_), \ 42*3498cc97SBin Meng ACPI_DEV_IRQ(0x0000, 1, b_), \ 43*3498cc97SBin Meng ACPI_DEV_IRQ(0x0000, 2, c_), \ 44*3498cc97SBin Meng ACPI_DEV_IRQ(0x0000, 3, d_), \ 45*3498cc97SBin Meng }) 46*3498cc97SBin Meng 47*3498cc97SBin Meng /* define as blank so ROOTPORT_METHODS only gets inserted once */ 48*3498cc97SBin Meng #define ROOTPORT_METHODS(prefix_, dev_) 49*3498cc97SBin Meng 50*3498cc97SBin Meng #else /* defined(PIC_MODE) */ 51*3498cc97SBin Meng 52*3498cc97SBin Meng #define ACPI_DEV_IRQ(dev_, pin_, pin_name_) \ 53*3498cc97SBin Meng Package() { ## dev_ ## ffff, pin_, 0, PIRQ ## pin_name_ ## _APIC_IRQ } 54*3498cc97SBin Meng 55*3498cc97SBin Meng #define RP_IRQ_ROUTES(prefix_, func_, a_, b_, c_, d_) \ 56*3498cc97SBin Meng Name(prefix_ ## func_ ## A, Package() \ 57*3498cc97SBin Meng { \ 58*3498cc97SBin Meng ACPI_DEV_IRQ(0x0000, 0, a_), \ 59*3498cc97SBin Meng ACPI_DEV_IRQ(0x0000, 1, b_), \ 60*3498cc97SBin Meng ACPI_DEV_IRQ(0x0000, 2, c_), \ 61*3498cc97SBin Meng ACPI_DEV_IRQ(0x0000, 3, d_), \ 62*3498cc97SBin Meng }) 63*3498cc97SBin Meng 64*3498cc97SBin Meng #define ROOTPORT_METHODS(prefix_, dev_) \ 65*3498cc97SBin Meng RP_METHOD(prefix_, dev_, 0) \ 66*3498cc97SBin Meng RP_METHOD(prefix_, dev_, 1) \ 67*3498cc97SBin Meng RP_METHOD(prefix_, dev_, 2) \ 68*3498cc97SBin Meng RP_METHOD(prefix_, dev_, 3) \ 69*3498cc97SBin Meng RP_METHOD(prefix_, dev_, 4) \ 70*3498cc97SBin Meng RP_METHOD(prefix_, dev_, 5) \ 71*3498cc97SBin Meng RP_METHOD(prefix_, dev_, 6) \ 72*3498cc97SBin Meng RP_METHOD(prefix_, dev_, 7) 73*3498cc97SBin Meng 74*3498cc97SBin Meng #endif /* defined(PIC_MODE) */ 75*3498cc97SBin Meng 76*3498cc97SBin Meng #define PCI_DEV_PIRQ_ROUTE(dev_, a_, b_, c_, d_) \ 77*3498cc97SBin Meng ACPI_DEV_IRQ(dev_, 0, a_), \ 78*3498cc97SBin Meng ACPI_DEV_IRQ(dev_, 1, b_), \ 79*3498cc97SBin Meng ACPI_DEV_IRQ(dev_, 2, c_), \ 80*3498cc97SBin Meng ACPI_DEV_IRQ(dev_, 3, d_) 81*3498cc97SBin Meng 82*3498cc97SBin Meng #define PCIE_BRIDGE_DEV(prefix_, dev_, a_, b_, c_, d_) \ 83*3498cc97SBin Meng ROOTPORT_IRQ_ROUTES(prefix_, a_, b_, c_, d_) \ 84*3498cc97SBin Meng ROOTPORT_METHODS(prefix_, dev_) 85*3498cc97SBin Meng 86*3498cc97SBin Meng #define ROOTPORT_IRQ_ROUTES(prefix_, a_, b_, c_, d_) \ 87*3498cc97SBin Meng RP_IRQ_ROUTES(prefix_, 0, a_, b_, c_, d_) \ 88*3498cc97SBin Meng RP_IRQ_ROUTES(prefix_, 1, b_, c_, d_, a_) \ 89*3498cc97SBin Meng RP_IRQ_ROUTES(prefix_, 2, c_, d_, a_, b_) \ 90*3498cc97SBin Meng RP_IRQ_ROUTES(prefix_, 3, d_, a_, b_, c_) \ 91*3498cc97SBin Meng RP_IRQ_ROUTES(prefix_, 4, a_, b_, c_, d_) \ 92*3498cc97SBin Meng RP_IRQ_ROUTES(prefix_, 5, b_, c_, d_, a_) \ 93*3498cc97SBin Meng RP_IRQ_ROUTES(prefix_, 6, c_, d_, a_, b_) \ 94*3498cc97SBin Meng RP_IRQ_ROUTES(prefix_, 7, d_, a_, b_, c_) 95*3498cc97SBin Meng 96*3498cc97SBin Meng #define RP_METHOD(prefix_, dev_, func_)\ 97*3498cc97SBin Meng Device (prefix_ ## 0 ## func_) \ 98*3498cc97SBin Meng { \ 99*3498cc97SBin Meng Name(_ADR, dev_ ## 000 ## func_) \ 100*3498cc97SBin Meng Name(_PRW, Package() { 0, 0 }) \ 101*3498cc97SBin Meng Method(_PRT) { \ 102*3498cc97SBin Meng If (PICM) { \ 103*3498cc97SBin Meng Return (prefix_ ## func_ ## A) \ 104*3498cc97SBin Meng } Else { \ 105*3498cc97SBin Meng Return (prefix_ ## func_ ## P) \ 106*3498cc97SBin Meng } \ 107*3498cc97SBin Meng } \ 108*3498cc97SBin Meng } 109*3498cc97SBin Meng 110*3498cc97SBin Meng /* SoC specific PIRQ route configuration */ 111*3498cc97SBin Meng #include <asm/arch/acpi/irqroute.h> 112