Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753665AbcKOMtU (ORCPT ); Tue, 15 Nov 2016 07:49:20 -0500 Received: from mail-by2nam01on0050.outbound.protection.outlook.com ([104.47.34.50]:39790 "EHLO NAM01-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750928AbcKOMtS (ORCPT ); Tue, 15 Nov 2016 07:49:18 -0500 Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; imgtec.com; dkim=none (message not signed) header.d=none;imgtec.com; dmarc=bestguesspass action=none header.from=xilinx.com; X-IncomingTopHeaderMarker: OriginalChecksum:;UpperCasedChecksum:;SizeAsReceived:1797;Count:20 Subject: Re: [Patch v7 3/7] irqchip: xilinx: restructure and use jump label api To: Zubair Lutfullah Kakakhel , , , , References: <20161114121351.10924-1-Zubair.Kakakhel@imgtec.com> <20161114121351.10924-4-Zubair.Kakakhel@imgtec.com> CC: , , , From: Michal Simek Message-ID: Date: Tue, 15 Nov 2016 13:49:00 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: <20161114121351.10924-4-Zubair.Kakakhel@imgtec.com> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit X-RCIS-Action: ALLOW X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.0.0.1202-22700.004 X-TM-AS-User-Approved-Sender: Yes;Yes X-IncomingHeaderCount: 20 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.83;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(7916002)(2980300002)(438002)(189002)(24454002)(199003)(106466001)(2950100002)(50986999)(4001350100001)(76176999)(8676002)(65806001)(65826007)(626004)(54356999)(8936002)(81156014)(63266004)(50466002)(31686004)(5660300001)(81166006)(36386004)(230700001)(36756003)(229853002)(9786002)(64126003)(77096005)(47776003)(65956001)(33646002)(7846002)(2906002)(5001770100001)(92566002)(2201001)(23746002)(356003)(189998001)(87936001)(305945005)(86362001)(31696002)(83506001)(4326007)(107986001);DIR:OUT;SFP:1101;SCL:1;SRVR:BN6PR02MB2865;H:xsj-pvapsmtpgw01;FPR:;SPF:Pass;PTR:unknown-60-83.xilinx.com;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;CY1NAM02FT052;1:Ru7/oWrM4HiYo6eyckwviTKk0XesOcmKMTuEoktYtM77zhyT99CsBP9f3AJ5xMrvhlKcCkrrc22x4XIO3D35qugSkDq4CdlycURvMJfTx48ZZbHnxxjGpa5vMssSLXIVg4L69hl3qWVmR50hCOnQJKJnNioH/ey4TFUHQOMm9xgDp+oiVj1dSQ85S7vsybnoilBAUEXUisUt4m6mMpfnYi66gCspkpv+Rxw8TwATEIgUTUhdsIXA88RmeA4MfDVcrnc7EytAT+VdSO/oxmSSMqc36532r8P69+nHMPRPiXcrL7f5E69CYxYokkp8PJwP92ZTGnpeYmwPEGTZChwHmYjr3G2i1YU6fjoenkGiS7ULRSGV+9T0FDN6gQqCjruFaJcZvhs+ghf7Qotzj//lAlmdslHrBPrgswC58ib2/yUJzgMK37tfS+Yrb5NaJZuyVcnHhLfLXw51Ys/0SB6RdHjkwGrGydNgvZ9u56i5EWcq5QOB/2D5066M5wUT0Tc27vHiuNO6hNcfXy6vun4u/lQwfDbtTFz/p5rmGCgXnAmCAHTUqGjjSeXTaef/jvkkalHofgAEwBOHIZKMKWVQqyksAIifvsAPdaChLwFiK+Y= X-Microsoft-Exchange-Diagnostics: 1;BN6PR02MB2865;2:pSi1DCLO7yIthbgQ2rOcTP6sMMBmkmU3t1DxfiQXBP76XwMxvtsWG8sIJk0OjPptiMKvcs6meQRfX1+/uaN7hDj+gomUiCvHcs4x0sAPClHjQwI76XmkekOlwWgfDrWa+4eLROmVhmY5lzKWKIzL+H9S+hrz9InzDzMWhspoBww=;3:/v0VzEb1FOOkGkllNrsATYiJLPW7dEJo52YoC3eKGkWu99NuZj3p7YjCcMXE1YrytJ3nNqf2dKsOzGckSdKkjCSbP68KtbSjQ0Wntnw1MXvC68wapAnIGMGV4SZWKX80t0Yzu5xyo+G/Adaij7QJxtGhKdjIyVzuEEm+rHoDSUz35EX09RwlrPt6/vZklCjrXuHHfLPbuYytze11PCEQTn1PoHi3dTxhunqzAJDBm9WdGC3UG+T6cx6iO6g8Zl30QTkPbEKjBpOMb3VEES8g081B4aGWlHZv0N+oSp5BM38=;25:16Rk2g5e3Mb/cirXQlkiKpm1CbOziQDCZMu7y6gbRTM8v/RYHVXlExJzy0La/Bn0h/t1w4QNde60aAC+eeMTIrdUVjNUgAMyyQu/rGlkoZwh3nAaL0S9/WFmEzKgWfoegqAoLNZwdlB4s80bycM+RGrJgowl4splBtmK0TGdrs1vvTy4j13h4tJebiwibOCMmuk3MHHl3q47u5vsD0mc9JNsmCKugSgPI4SzhqPNo9huuejqG78ga4pzja4P5lOKNn9agxUli/tm0QzaJLL3ot+kN+1tzes8cJ0iD0nZ9uhEJ1ZZUZagn9i9AFENRmuQ6HvRGzeWMYU0eiujj0Kg8I82wphfRUCJZrhmwaJUno+uD4UcO0T9807J99G3RuJ+AJWYnQeM5NB3r/jAIQS3qaWSVZ/ZjOdvoY1tO/EEamd+cuiWldbCbER6KmRT5je0 X-MS-Office365-Filtering-Correlation-Id: 070abe0c-7a63-4e90-8167-08d40d55cd61 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(8251501002);SRVR:BN6PR02MB2865; X-LD-Processed: 657af505-d5df-48d0-8300-c31994686c5c,ExtAddr X-Microsoft-Exchange-Diagnostics: 1;BN6PR02MB2865;31:GeB8GOj4KZk+wmNswB9LzbFBSi6rrAKuT+LOASNkaWv+SI/rC1Ri0p9lDEuGrOqJSWJfYm2uzXmR4lvQrqPvFRtV0l1KcXKm+Pt/Eo/sVIrAQYicpwt6N6XBoI014holHb3lWSYbmjg51SVERUaDDFFw4PHu4sZvbQuC0iOR/xnf7pLEDPNkkiGQwIHod+JNfvwG+KR/Sk/iFJ0JklR5/KQ/jbkIqInNPB6KB/m/VBYDxjXkQCUSBp36R+awAD90p1gHBEC4weq20009Wtgv4Q==;20:2WaQ4Gk4WOWjyF6A4dUg+7KcP+guR67zLMwSw/dp3ZvSYy8OKyHDtDZNwOTZuhtMesHLCrM9dEGRhowNUSBBeQesWlFeZoV8UuQ6FSqlYddQ7uu2/HQQUt5jq/xe8pe4XUdr5p2cGzO5ARPTG6QmgYAKmDDqq78iNycRYrzSSClbyU9BcAHnYn9tw1rPhYsS4de7xUXo7xMBJRPIf/kOzPDkpmHcJCB/pncVr9K6MayvtA80gd0+EwY4kUaoSqapaH/X6bzAlg9SDBdPeEXKGYV07L/0ZBAxoJNveWwNS7rLwWBik+R0jkyoqc37brvvT4mnBRE176yIQR8jVsbObKhJVBIbfOw2Ms6SvVyrmWJLBbgFDzKzLCPTmpkHm3XzBpeaQFltowzeYM2dUtqOuOTssji7SnlQHwI7cT3XeJoyczNTX8QeyM4GkGHFdyjo8jc5Hhh35ExqsewkNKpvhKRgIZJhpdhN4/A9la9PrY4MA5P2eh7HNmHGpUHWv0iU X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(166708455590820)(21532816269658); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6060326)(601004)(2401047)(13017025)(13018025)(5005006)(13024025)(8121501046)(13023025)(13015025)(3002001)(10201501046)(6055026)(6061324);SRVR:BN6PR02MB2865;BCL:0;PCL:0;RULEID:;SRVR:BN6PR02MB2865; X-Microsoft-Exchange-Diagnostics: 1;BN6PR02MB2865;4:z2twuCvE+6l1qhiRlCSDb7CjHrgkDCyf5LtqzKzS/45RrVsuPJsOmIk5Nfuehl+lcgldXOz0zgoyZTiKMFocLveFXrgZEWZdG0RBAOBk9GjFgtvHf1GtSI3FDcTs2G7ooySweH/5cPgL86KndrT2gFyaGaKRQPczNMPC9ZB33fAoLIEM84/xLLy1P343fYyDzDNwc01AIxPH3RkhsLqJqqVpflV278g1uyXUWRqibRIobmbol9t2QmqRP2Of0MQF5tXWz96tVF7zi/j5rWb7kOUbxh5CD9HCMON294wT3Gw7cC61PR1eMznVwmgmkE9kfiUPY3fe021MQpyoWjJ+ggewgnocPz4ju2FvzyuNEyV1G+Ho8+Lo8O2HFjEpGC86L/sDriyo7/AiD4L9kqg15d+euqycLpMg2Lhbn0Q5XH4Sj3vb1/GBKYRV79GKtSlh9Df6t8aJvxogMvUZNgh24sdL7338egqn6rOidm4mdksOiTtVgD0Lmot9A21Q3LLRuzTNAFHvsNX5ruIGrq4YrNGnUaVYrYIPt/x0aQ16PSJJhYqdpLu7M7dEgAodFinADU8bDBCs6une/87bXd/GT1+zCrbx73KxAO12/ibY2Aw= X-Forefront-PRVS: 012792EC17 X-Microsoft-Exchange-Diagnostics: =?Windows-1252?Q?1;BN6PR02MB2865;23:A8x263gS8Mw3FgMjeeSMZwkffv1ArH0/u0VUb?= =?Windows-1252?Q?/zEUZaT0g4CCt5l/NXQ0NMcOzpR+6g8tskFcAnx/8S52K2LZLBBL01Ay?= =?Windows-1252?Q?civ+81fR8aKZVaX/eIxPsTAYt4Cpx4rvliaC7l3S7GpBqnMyEcFzGGM+?= =?Windows-1252?Q?EQ5jX1NaKGkFS9cbIge/BioeKsVeWVeN82shRwCtlG0FI52HY0GI6Bo4?= =?Windows-1252?Q?qrNtAuZ6VUO2WnCIIc+CcKfwFNrlpa2fHFKfVtOHPTEPSy7oMbNI6zIB?= =?Windows-1252?Q?EP9Qjtg4kdq3ulxwM4vpbd/06SspLCS7bFYzBfBIteBJfKTCgXjmMyTf?= =?Windows-1252?Q?PeqBusKkbBGjCnoQ33H3/vKnJcGnLop+nJu350YUnerVjjJAW4gBBKaK?= =?Windows-1252?Q?rQTpyAIaogBfAgpuVZEW+IC6XMqo/cBKlClYKajQ+JWCI8ktuGGObTPH?= =?Windows-1252?Q?lC/9lWBEWW+AoOovJUkFSLppjfQja4mqiIqeSeTAzwK+jYp8P++mclck?= =?Windows-1252?Q?9caYN//2HzL4WClzqylB1H+wPo4hocnLkrfulBwHKaVDkD58+f2tH+K0?= =?Windows-1252?Q?gAxE2OeYIhRcnQeXCcvC3ToV0juUeTpiMXjo4Cg/boBbTOlfeO3E8Tfe?= =?Windows-1252?Q?OhmO6D4Xx7+v1KXxnqclAKHp8WYShltr5Qqdn+bKHcMdd3Y4r1uMa/fm?= =?Windows-1252?Q?FeeW7ydB6hS32sBRiNpDZXhPIVRSXzQB+YYO8YckrR+wT2svuE/oIDZ1?= =?Windows-1252?Q?d6qEKWHi4lJb1bXUTnAbRwl9FvPgTi7mkiJiXASmDDDvplQH+K7oHWJp?= =?Windows-1252?Q?GPFN7pCwXi/Hzm23MFuJQCKRcThJbZntL03X00Fif6xJ4xab8iUsSXFh?= =?Windows-1252?Q?rrJjt6ze2DRiUff159utafogRsQO5xHL3a1MO8MTeKjdHA07LWbhPTZk?= =?Windows-1252?Q?OCkqUCF1ThoMHa06P8gm2YmQLooTskcpOA9s9kpFplSVnu02qiEw7Mxx?= =?Windows-1252?Q?W+uSmAjDXalL3WKGeU3uA5hu9jbdS76ztXwTOiJOpx8NuVgmJeMNLTsI?= =?Windows-1252?Q?u9FQ29G7XQw8dNb6Pok3+B6jpsBnpYGz6qzQXumwWxfZx2yTLJzdYjkd?= =?Windows-1252?Q?Ol6rQ3253yoBlhBL0wNytW+XP8gEkUCuTy9sN6N1SQuZ4Em/eNH3wA6I?= =?Windows-1252?Q?saKZ7YN1ElFmS2j0+FMwadGHFcByRjYiaVuZiVnuCoFm2SxOvCRKWDpC?= =?Windows-1252?Q?uRBL/OTdEc+KdbHmYamcZMt+903t4Q3BGL0IrA=3D?= X-Microsoft-Exchange-Diagnostics: 1;BN6PR02MB2865;6:55nye5vr2zF3oJiCK4mYAkA2XxC3QvDiyjHvRSWhZsLcb/Lvc9Nf91Spl0tMtNbldoifkeIkDSPfXGo4UPXrleE/ZWM8/+OZ6uUbeD+7L2tTrpy1jmdWH10DFbUIgxh8wijO/XAQLCN9co4NWgLAYOrH/4Wydokg6unQ7rgfeYHGlSP9f3SWI4AyofmUPfdPccNFvdV9LxGCUd1sY6G/Y2tBHKrZXVZMSa2z7I+pk2uCSP7CfQK+ucScyyCVcN4pIUPX6ewv7YXBJjBBXXbpd6dz3nx0H9c7jlGxWWcDJgYouk85YeFKiacpm2SmOjXLRFMfOm5hoRH0SNnFB7ChTUD68f9wQGPSTPc5NdSooOSku3YrMGVJE1bLWGoXHkHF;5:DoJ+Khw/eO0grWdlLUCRNrtxtS6iY0Bpa773jYyZqzLOLcKYknpZuJZuRsIP+Fh08eW8bSkzEvsO6sj+TWS9f4j/4TEMYmuVGFm+E2VufriJgHsWvcyMegzai9S0NmjD3VeRr2cYjcl9CaiiLumqlau+oJGojWl/4TKGtNJaDz8=;24:GyqLWWcWKIsHdzWP2ZE9/TAh/S9AqZaD+UmwXl9GWkH32PiF1nPyhyOFLxLAa7a0wuhNP0yX0cqV1ZeK1rkoPEIZaWNEamldvVq0wfgy9nY= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;BN6PR02MB2865;7:mMoTQJH8zlDVbtrkBe4uLWep0WDUKquOAb9SeG+d+RRW+CeuvBENjAqCZ6aw1pQyXyttjElcdb0RlJuXuNuIYx4e6tr6dj4gbwb8Z3Og0pmgP114vQjvwQg0COcvipAhaTtkZG4tzWxEIXbGQIm0kIBPzrFTpw9hM1aIaCaC481CzU3nBhuLbMbqBvlbEdjPrqedyiCj3n1MeSzc6gqV55urb0CDVSPgp4MfZb3US+jJfZNhfG6r1DP8Xn4IoglODNNd552uxMNl9Jgqzu46b5DNfVxjdIUeuED+BdZRCY1mSdbAa72Ii0AzomeA5Vafej8ssI1gYVyA+2JHGIQB3cQUEip1GPu52N8F9Kxw88s= X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Nov 2016 12:49:10.4713 (UTC) X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c;Ip=[149.199.60.83];Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR02MB2865 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 6058 Lines: 200 On 14.11.2016 13:13, Zubair Lutfullah Kakakhel wrote: > Add a global structure to house various variables. > And cleanup read/write handling by using jump label api. > > Signed-off-by: Zubair Lutfullah Kakakhel > > --- > V6 -> V7 > Restructure and use jump label api > Better commit log > > V5 -> V6 > Removed __func__ from printk > Rebase to v4.9-rc3 > > V4 -> V5 > Rebased to v4.9-rc1 > Better error handling > > V3 -> V4 > Better error handling for kzalloc > Erroring out if the axi intc is probed twice as that isn't > supported > > V2 -> V3 > New patch. Cleans up driver structure > --- > drivers/irqchip/irq-xilinx-intc.c | 118 +++++++++++++++++++++----------------- > 1 file changed, 66 insertions(+), 52 deletions(-) > > diff --git a/drivers/irqchip/irq-xilinx-intc.c b/drivers/irqchip/irq-xilinx-intc.c > index 096c1ed..7331d8c 100644 > --- a/drivers/irqchip/irq-xilinx-intc.c > +++ b/drivers/irqchip/irq-xilinx-intc.c > @@ -14,10 +14,9 @@ > #include > #include > #include > +#include > #include > > -static void __iomem *intc_baseaddr; > - > /* No one else should require these constants, so define them locally here. */ > #define ISR 0x00 /* Interrupt Status Register */ > #define IPR 0x04 /* Interrupt Pending Register */ > @@ -31,27 +30,30 @@ static void __iomem *intc_baseaddr; > #define MER_ME (1<<0) > #define MER_HIE (1<<1) > > -static unsigned int (*read_fn)(void __iomem *); > -static void (*write_fn)(u32, void __iomem *); > +static DEFINE_STATIC_KEY_FALSE(xintc_is_be); > > -static void intc_write32(u32 val, void __iomem *addr) > -{ > - iowrite32(val, addr); > -} > +struct xintc_irq_chip { > + void __iomem *base; > + struct irq_domain *root_domain; > + u32 intr_mask; > +}; > > -static unsigned int intc_read32(void __iomem *addr) > -{ > - return ioread32(addr); > -} > +static struct xintc_irq_chip *xintc_irqc; > > -static void intc_write32_be(u32 val, void __iomem *addr) > +static void xintc_write(int reg, u32 data) > { > - iowrite32be(val, addr); > + if (static_branch_unlikely(&xintc_is_be)) > + iowrite32be(data, xintc_irqc->base + reg); > + else > + iowrite32(data, xintc_irqc->base + reg); > } > > -static unsigned int intc_read32_be(void __iomem *addr) > +static unsigned int xintc_read(int reg) > { > - return ioread32be(addr); > + if (static_branch_unlikely(&xintc_is_be)) > + return ioread32be(xintc_irqc->base + reg); > + else > + return ioread32(xintc_irqc->base + reg); > } > > static void intc_enable_or_unmask(struct irq_data *d) > @@ -65,21 +67,21 @@ static void intc_enable_or_unmask(struct irq_data *d) > * acks the irq before calling the interrupt handler > */ > if (irqd_is_level_type(d)) > - write_fn(mask, intc_baseaddr + IAR); > + xintc_write(IAR, mask); > > - write_fn(mask, intc_baseaddr + SIE); > + xintc_write(SIE, mask); > } > > static void intc_disable_or_mask(struct irq_data *d) > { > pr_debug("irq-xilinx: disable: %ld\n", d->hwirq); > - write_fn(1 << d->hwirq, intc_baseaddr + CIE); > + xintc_write(CIE, 1 << d->hwirq); > } > > static void intc_ack(struct irq_data *d) > { > pr_debug("irq-xilinx: ack: %ld\n", d->hwirq); > - write_fn(1 << d->hwirq, intc_baseaddr + IAR); > + xintc_write(IAR, 1 << d->hwirq); > } > > static void intc_mask_ack(struct irq_data *d) > @@ -87,8 +89,8 @@ static void intc_mask_ack(struct irq_data *d) > unsigned long mask = 1 << d->hwirq; > > pr_debug("irq-xilinx: disable_and_ack: %ld\n", d->hwirq); > - write_fn(mask, intc_baseaddr + CIE); > - write_fn(mask, intc_baseaddr + IAR); > + xintc_write(CIE, mask); > + xintc_write(IAR, mask); > } > > static struct irq_chip intc_dev = { > @@ -99,15 +101,13 @@ static struct irq_chip intc_dev = { > .irq_mask_ack = intc_mask_ack, > }; > > -static struct irq_domain *root_domain; > - > unsigned int get_irq(void) > { > unsigned int hwirq, irq = -1; > > - hwirq = read_fn(intc_baseaddr + IVR); > + hwirq = xintc_read(IVR); > if (hwirq != -1U) > - irq = irq_find_mapping(root_domain, hwirq); > + irq = irq_find_mapping(xintc_irqc->root_domain, hwirq); > > pr_debug("irq-xilinx: hwirq=%d, irq=%d\n", hwirq, irq); > > @@ -116,9 +116,7 @@ unsigned int get_irq(void) > > static int xintc_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw) > { > - u32 intr_mask = (u32)d->host_data; > - > - if (intr_mask & (1 << hw)) { > + if (xintc_irqc->intr_mask & (1 << hw)) { > irq_set_chip_and_handler_name(irq, &intc_dev, > handle_edge_irq, "edge"); > irq_clear_status_flags(irq, IRQ_LEVEL); > @@ -138,59 +136,75 @@ static const struct irq_domain_ops xintc_irq_domain_ops = { > static int __init xilinx_intc_of_init(struct device_node *intc, > struct device_node *parent) > { > - u32 nr_irq, intr_mask; > + u32 nr_irq; > int ret; > + struct xintc_irq_chip *irqc; > > - intc_baseaddr = of_iomap(intc, 0); > - BUG_ON(!intc_baseaddr); > + if (xintc_irqc) { > + pr_err("irq-xilinx: Multiple instances aren't supported\n"); > + return -EINVAL; > + } I don't agree with this. Pretty long time ago we were added support for multiple instances in xilinx private tree. You can look here. https://github.com/Xilinx/linux-xlnx/blob/master/drivers/irqchip/irq-xilinx-intc.c Not sure if this the latest way how to do it but as you can see we were setting up irq_set_handler_data(irq, intc); and then when you need that structure we were calling struct intc *local_intc = irq_data_get_irq_chip_data(d); And that should be it to support multiple instance of this driver. Based on 5/7 you are describing your interrupt subsystem like this. Peripherals --> xilinx_intcontroller -> mips_cpu_int controller If mips_cpu_int has more than one input you can connect more xilinx intc controllers. If not you still have an option to connect xilinx_intcontroller(up to 32 peripherals) -> xilinx_intcontroller(one intc + up to 31 peripherals) -> mips_cpu_int controller Thanks, Michal