From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751882AbdFPRBL (ORCPT ); Fri, 16 Jun 2017 13:01:11 -0400 Received: from m12-16.163.com ([220.181.12.16]:56136 "EHLO m12-16.163.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750780AbdFPRBJ (ORCPT ); Fri, 16 Jun 2017 13:01:09 -0400 Subject: Re: [RFT v2] pinctrl: samsung: Fix NULL pointer exception on external interrupts on S3C24xx To: Krzysztof Kozlowski , Kukjin Kim , Tomasz Figa , Sylwester Nawrocki , Linus Walleij , linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Chanwoo Choi , Marek Szyprowski , Sergio Prado , Donglin Peng , stable@vger.kernel.org References: <20170615154637.9830-1-krzk@kernel.org> From: Lihua Yao Message-ID: Date: Sat, 17 Jun 2017 00:59:45 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.1.1 MIME-Version: 1.0 In-Reply-To: <20170615154637.9830-1-krzk@kernel.org> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US X-CM-TRANSID: EMCowAD3_jKCDkRZ2tseKQ--.34176S2 X-Coremail-Antispam: 1Uf129KBjvJXoW7Kr4ktFWxJryxCry3Cry5twb_yoW8tw1xpr ZxXrsIyr4DJrWUZr4kKryj9F13Z395Wr1YqF4SgrZavr1YgFyftFW0gF1FvFn0kry8ZFs8 Kr17Xa4Fgan8u37anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x07ji_-PUUUUU= X-Originating-IP: [223.74.128.60] X-CM-SenderInfo: 51ok3txmqxqiywtou0bp/1tbiKQP4cVXlipBBqQAAsh Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thursday, June 15, 2017 11:46 PM, Krzysztof Kozlowski wrote: > After commit 8b1bd11c1f8f ("pinctrl: samsung: Add the support the > multiple IORESOURCE_MEM for one pin-bank"), the S3C24xx (and probably > S3C64xx as well) fails: > > Unable to handle kernel NULL pointer dereference at virtual address 000000a8 > ... > (s3c24xx_demux_eint4_7) from [] (__handle_domain_irq+0x6c/0xcc) > (__handle_domain_irq) from [] (s3c24xx_handle_irq+0x6c/0x12c) > (s3c24xx_handle_irq) from [] (__irq_svc+0x5c/0x78) > > Mentioned commit moved the pointer to controller's base IO memory address > from each controller's driver data (samsung_pinctrl_drv_data) to per-bank > structure (samsung_pin_bank). The external interrupt demux > handlers (s3c24xx_demux_eint()) tried to get this base address from opaque > pointer stored under irq_chip data: > > struct irq_data *irqd = irq_desc_get_irq_data(desc); > struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd); > ... > pend = readl(bank->eint_base + EINTPEND_REG); > > which is wrong because this is hardware irq and it bank was never set > for this irq_chip. > > For S3C24xx and S3C64xx, this partially reverts mentioned commit by > bringing back the virt_base stored under each controller's driver data > (samsung_pinctrl_drv_data). This virt_base address will be now > duplicated: > - samsung_pinctrl_drv_data->virt_base: used on S3C24xx and S3C64xx, > - samsung_pin_bank->pctl_base: used on Exynos. > > Fixes: 8b1bd11c1f8f ("pinctrl: samsung: Add the support the multiple IORESOURCE_MEM for one pin-bank") > Cc: > Cc: Sergio Prado > Reported-by: Sergio Prado > Signed-off-by: Krzysztof Kozlowski > > --- > > Tested on Odroid XU3. > Please kindly test on S3C24xx and S3C64xx. Other tests, including > Exynos5433 are also welcomed. > > Changes since v1: > 1. Fix NULL pointer exception when setting virt_base because bdata > pointer is invalid at this point (incremented by loop). Spotted > by Yao Lihua. > --- Works well for me. Tested on TINY6410 board. Tested-by: Lihua Yao Thanks! Lihua