From patchwork Wed Aug 31 12:24:40 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Darren Stevens X-Patchwork-Id: 664561 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3sPS3t1LVvz9sxS for ; Thu, 1 Sep 2016 00:11:22 +1000 (AEST) Received: from ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3sPS3t0YSBzDrkB for ; Thu, 1 Sep 2016 00:11:22 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.17.13]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3sPS2g2DwPzDrfP for ; Thu, 1 Sep 2016 00:10:19 +1000 (AEST) Received: from [127.0.0.1] ([31.52.206.186]) by mrelayeu.kundenserver.de (mreue102) with ESMTPA (Nemesis) id 0MA5Q9-1bqLcZ1g2D-00BH4K; Wed, 31 Aug 2016 16:05:06 +0200 From: Darren Stevens To: linuxppc-dev@lists.ozlabs.org Date: Wed, 31 Aug 2016 13:24:40 +0100 (BST) Message-ID: <48ba9b707d0.721225f3@auth.smtp.1and1.co.uk> User-Agent: YAM/2.9p1 (AmigaOS4; PPC; rv:20140418r7798) Subject: [ RFC PATCH 2/3] powerpc/pasemi: Fix Nemo SB600 i8259 interrupts. MIME-Version: 1.0 Content-type: multipart/mixed; boundary="--=_BOUNDARY.6dab4a807c6aaf60.95" X-Provags-ID: V03:K0:4upGMCJnNXcwfgrBvkW1qrNnCSVX85T0javapZ+SA1hFQyO3Sd1 ReYBm/ZrNzlmXDY2rp5LQ6gF8IS1mL3C2g+tRUxWzvz21Qj/Xkq2eOS+j1Tff2EKK0aszwW uCHBK55ToekiZYigX2Z1ZbeJM5XPzze+iwpLXcROzLj3U3Yq5SBBiC+1xm/vD9A8lVdOxRm TPx+CcBT9P2N7ySbljUhg== X-UI-Out-Filterresults: notjunk:1; V01:K0:qGuJdyzuse4=:a8aImzG8qubZyJCgybsXcg XNhF6IZDVy6Xj2Co4SeP21n9ZOpJXP/F5MOuAMrj9lNcelKd9nIOyfco3kM9/X8NIe/bcGYhM 0gU4QhDuSFi03XiT7dQbsxOrBXE3HISa7Pau2Rt+glwE44shVM3IfF6wFvjvyKsFCJi9ig7qx r2Ss4QuGb4slAy0FJ3WLFM1CCe1OAiBLBXCX5kyxqAroQyJ17eftOUMPnMfhmTmJX1Kdfh9Z+ o1keL+brp+FhUTsqGzWCKDnpDMee9OVxEV7QhE2At4ywMWr8Sx/7q0b3F6c262/LtuXlhutJ6 Et3wIShT5o4vKUA89TBgWhnX8N9fozVqQ1AFGgFGBMJtI8b9LorSXh1wMGFs7KbiheiCZ+LxP rVRxPtT/rf8mNiHf3ym4BgWxZq8YY7gFxxfSF5ZIGdQdpKQQUcY0BwmjpPuf3gIPf6E/bJ5ZL Y1FVk8qeOcgXDanyEgj5Io1MgQbFFnj/4La01/IMVgDz6KpYX0fUj6Ar0wI6fS/QFcEspn/oQ jRHZVoRCQKPJE69ht1uIXwaJIQ0P217aup5ZnPCm1CQxT7IHhENU4XmrK9HB9d9E3IB/MxHGw jVz1H5RcxgYMH4w5Msy9ecpswhGe1sKJgKNpLeVHaBfspjlCGKHhwSYD2z3Mc9IU8oQ/u12TG tFBPATak9ovGD+fjDkI1+j+WMrE0F9xEUXwGqf3wgJGvvHAjWXA50bcTbz8BCaWD9lRc= X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: olof@lixom.net, chzigotzky@xenosoft.de Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" The device tree on the Nemo passes all of the i8259 interruts with numbers between 212 and 222, and points their interrupt-parent property to the pasemi-opic, requiring custom patches to the kernel. Fix the values so that they can be controlled by the generic ppc i8259 code. Signed-off-by: Darren Stevens diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index 4e74fc5..8269093 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c @@ -2639,6 +2639,69 @@ static void __init fixup_device_tree_efika(void) #else #define fixup_device_tree_efika() #endif +#ifdef CONFIG_PPC_PASEMI +static void __init fixup_device_tree_pasemi(void) +{ +#ifdef CONFIG_PPC_PASEMI_NEMO +/* + * CFE supplied on Nemo is broken in several ways, biggest + * problem is that it reassigns ISA interrupts to unused mpic ints. + * Add an interrupt-controller property for the io-bridge to use + * and correct the ints so we can attach them to an irq_domain + */ + phandle iob, node; + u32 interrupts[2]; + u32 parent; + u32 val = 0, rval; + char * name, * pci_name; + + /* Find the root pci node */ + name = "/pxp@0,e0000000"; + iob = call_prom("finddevice", 1, 1, ADDR(name)); + if (!PHANDLE_VALID(iob)) + return; + + /* check if interrupt-controller node set yet */ + if (prom_getproplen(iob, "interrupt-controller") !=PROM_ERROR) + return; + + prom_printf("adding interrupt-controller property for SB600...\n"); + + prom_setprop(iob, name, "interrupt-controller", &val, 0); + + pci_name = "/pxp@0,e0000000/pci@11"; + node = call_prom("finddevice", 1, 1, ADDR(pci_name)); + parent = ADDR(iob); + for( ; prom_next_node(&node); ) { + /* scan each node for one with an interrupt */ + if (PHANDLE_VALID(node)) { + rval = prom_getproplen(node, "interrupts"); + if (rval != 0 && rval != PROM_ERROR) { + prom_getprop(node, "interrupts", &interrupts, sizeof(interrupts)); + if ((interrupts[0] > 211) && (interrupts[0] < 223)) { + /* found a node, update both interrupts and interrupt-parent */ + if ((interrupts[0] > 211) && (interrupts[0] < 216)) + interrupts[0] -= 203; + if ((interrupts[0] > 215) && (interrupts[0] < 221)) + interrupts[0] -= 213; + if (interrupts[0] == 221) + interrupts[0] = 14; + if (interrupts[0] == 222) + interrupts[0] = 8; + + prom_setprop(node, pci_name, "interrupts", interrupts, + sizeof(interrupts)); + prom_setprop(node, pci_name, "interrupt-parent", &parent, + sizeof(parent)); + } + } + } + } +#endif //CONFIG_PPC_PASEMI_NEMO +} +#else +#define fixup_device_tree_pasemi() +#endif static void __init fixup_device_tree(void) { @@ -2647,6 +2710,7 @@ static void __init fixup_device_tree(void) fixup_device_tree_chrp(); fixup_device_tree_pmac(); fixup_device_tree_efika(); + fixup_device_tree_pasemi(); } static void __init prom_find_boot_cpu(void)