* [PATCH 0/2] gpio: davinci: fix probe-time IRQ setup @ 2026-11-09 19:49 Sahaj Chaudhari 2026-11-09 19:49 ` [PATCH 1/2] gpio: davinci: use controller-specific MMIO for BINTEN Sahaj Chaudhari 2026-11-09 19:49 ` [PATCH 2/2] gpio: davinci: allocate bank IRQ data before installing handlers Sahaj Chaudhari 0 siblings, 2 replies; 4+ messages in thread From: Sahaj Chaudhari @ 2026-11-09 19:49 UTC (permalink / raw) To: linusw, brgl Cc: Sahaj Chaudhari, j-keerthy, nsekhar, prabhakar.csengg, avinashphilip, sujithkv, linux-gpio, linux-kernel This series fixes two independent probe-time bugs in the DaVinci GPIO driver: 1. A file-global MMIO base can be overwritten by overlapping controller probes, causing BINTEN setup to target the wrong controller. 2. Per-bank IRQ data is allocated as chained handlers are installed. A later allocation failure can leave handlers pointing to devm-managed data freed during probe unwind. The first patch derives BINTEN from the current controller's mapped bank. The second allocates all IRQ data before installing any handlers. --- Testing: - ARM64 W=1 Image builds passed for both patches. - On AM642, a forced asynchronous-probe interleave made the baseline compute the wrong BINTEN target. The test redirected the unsafe baseline write before it reached hardware; the fixed path selected the expected target and verified readback 0x3f. - With targeted probe allocation failure, the baseline left one chained handler installed; it was detached safely before devm cleanup. The fixed path left no handlers installed and reprobed normally. The private baseline and fixed kernels showed unexplained TAINT_MACHINE_CHECK bit 16. No BUG/Oops/WARNING/call trace/SError was captured; the cause remains unknown, so this is not a clean hardware-health claim. GitHub Copilot CLI assisted with investigating the bugs and drafting the fixes. The submitter reviewed the code and personally ran both board tests. Sahaj Chaudhari (2): gpio: davinci: use controller-specific MMIO for BINTEN gpio: davinci: allocate bank IRQ data before installing handlers drivers/gpio/gpio-davinci.c | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) base-commit: 4fc2c9ab68f4324bea62cb5a43e93392225f1d11 -- 2.43.0 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/2] gpio: davinci: use controller-specific MMIO for BINTEN 2026-11-09 19:49 [PATCH 0/2] gpio: davinci: fix probe-time IRQ setup Sahaj Chaudhari @ 2026-11-09 19:49 ` Sahaj Chaudhari 2026-11-10 23:20 ` sashiko-bot 2026-11-09 19:49 ` [PATCH 2/2] gpio: davinci: allocate bank IRQ data before installing handlers Sahaj Chaudhari 1 sibling, 1 reply; 4+ messages in thread From: Sahaj Chaudhari @ 2026-11-09 19:49 UTC (permalink / raw) To: linusw, brgl Cc: Sahaj Chaudhari, j-keerthy, nsekhar, prabhakar.csengg, avinashphilip, sujithkv, linux-gpio, linux-kernel The file-global gpio_base can be overwritten when probes for multiple DaVinci GPIO controllers overlap. The later IRQ setup can then write the BINTEN register of a different controller. Derive the BINTEN address from the current controller's mapped bank instead of shared global state. Fixes: 118150f22d6b ("gpio: davinci: move to platform device") Signed-off-by: Sahaj Chaudhari <sahaj123.sc@gmail.com> --- drivers/gpio/gpio-davinci.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpio/gpio-davinci.c b/drivers/gpio/gpio-davinci.c index f7c3b644e0e3..caeecfc3df20 100644 --- a/drivers/gpio/gpio-davinci.c +++ b/drivers/gpio/gpio-davinci.c @@ -43,7 +43,6 @@ typedef struct irq_chip *(*gpio_get_irq_chip_cb_t)(unsigned int irq); #define BINTEN 0x8 /* GPIO Interrupt Per-Bank Enable Register */ -static void __iomem *gpio_base; static unsigned int offset_array[5] = {0x10, 0x38, 0x60, 0x88, 0xb0}; struct davinci_gpio_irq_data { @@ -168,6 +167,7 @@ static int davinci_gpio_probe(struct platform_device *pdev) unsigned int ngpio, nbank, nirq, gpio_unbanked; struct davinci_gpio_controller *chips; struct device *dev = &pdev->dev; + void __iomem *gpio_base; /* * The gpio banks conceptually expose a segmented bitmap, @@ -588,7 +588,7 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev) * BINTEN -- per-bank interrupt enable. genirq would also let these * bits be set/cleared dynamically. */ - writel_relaxed(binten, gpio_base + BINTEN); + writel_relaxed(binten, chips->regs[0] - offset_array[0] + BINTEN); return 0; } -- 2.43.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 1/2] gpio: davinci: use controller-specific MMIO for BINTEN 2026-11-09 19:49 ` [PATCH 1/2] gpio: davinci: use controller-specific MMIO for BINTEN Sahaj Chaudhari @ 2026-11-10 23:20 ` sashiko-bot 0 siblings, 0 replies; 4+ messages in thread From: sashiko-bot @ 2026-11-10 23:20 UTC (permalink / raw) To: Sahaj Chaudhari; +Cc: linux-gpio Thank you for your contribution! Sashiko AI review found no new issues in this patch, but noticed 1 related pre-existing issue it does not introduce: - [Critical] gpio: davinci: out-of-bounds array access in davinci_gpio_probe() [1] -- commit 28eb7330290061761743897d388da288ba076340 Author: Sahaj Chaudhari <sahaj123.sc@gmail.com> gpio: davinci: use controller-specific MMIO for BINTEN This commit makes gpio_base local to davinci_gpio_probe() and derives the BINTEN register address from the controller's mapped bank rather than a file-global variable. > diff --git a/drivers/gpio/gpio-davinci.c b/drivers/gpio/gpio-davinci.c > index f7c3b644e0e39..caeecfc3df204 100644 > --- a/drivers/gpio/gpio-davinci.c > +++ b/drivers/gpio/gpio-davinci.c [ ... ] > @@ -168,6 +167,7 @@ static int davinci_gpio_probe(struct platform_device *pdev) > unsigned int ngpio, nbank, nirq, gpio_unbanked; > struct davinci_gpio_controller *chips; > struct device *dev = &pdev->dev; > + void __iomem *gpio_base; > > /* > * The gpio banks conceptually expose a segmented bitmap, [Severity: Critical] This problem wasn't introduced by this patch, but can a large ti,ngpio value overflow offset_array[] and chips->regs[] [1]? When ti,davinci-gpio-unbanked is set, nirq is taken from gpio_unbanked rather than DIV_ROUND_UP(ngpio, 16), so the nirq > MAX_INT_PER_BANK check never bounds ngpio: drivers/gpio/gpio-davinci.c:davinci_gpio_probe() { ... if (gpio_unbanked) nirq = gpio_unbanked; else nirq = DIV_ROUND_UP(ngpio, 16); if (nirq > MAX_INT_PER_BANK) { dev_err(dev, "Too many IRQs!\n"); return -EINVAL; } ... nbank = DIV_ROUND_UP(ngpio, 32); for (bank = 0; bank < nbank; bank++) chips->regs[bank] = gpio_base + offset_array[bank]; ... } If ngpio exceeds 160, nbank exceeds 5 (MAX_REGS_BANKS), and the loop reads past the end of offset_array[] and writes out-of-bounds into chips->regs[], corrupting memory in struct davinci_gpio_controller. [1] https://sashiko.dev/#/bug/linux-59cf1b6f-2241-467c-a82a-93a3d1bf5d16 -- Sashiko AI review · https://sashiko.dev/#/patchset/20261109194910.2282454-1-sahaj123.sc@gmail.com?part=1 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 2/2] gpio: davinci: allocate bank IRQ data before installing handlers 2026-11-09 19:49 [PATCH 0/2] gpio: davinci: fix probe-time IRQ setup Sahaj Chaudhari 2026-11-09 19:49 ` [PATCH 1/2] gpio: davinci: use controller-specific MMIO for BINTEN Sahaj Chaudhari @ 2026-11-09 19:49 ` Sahaj Chaudhari 1 sibling, 0 replies; 4+ messages in thread From: Sahaj Chaudhari @ 2026-11-09 19:49 UTC (permalink / raw) To: linusw, brgl Cc: Sahaj Chaudhari, j-keerthy, nsekhar, prabhakar.csengg, avinashphilip, sujithkv, linux-gpio, linux-kernel If allocation fails partway through bank setup, previously installed chained handlers still point at devm-managed data that is released when probe fails. Allocate the complete bank-data array before installing the first chained handler so an allocation failure leaves no handlers behind. This fixes the probe-failure path; it does not change ordinary device removal. Fixes: b5cf3fd827d2 ("gpio: davinci: Redesign driver to accommodate ngpios in one gpio chip") Signed-off-by: Sahaj Chaudhari <sahaj123.sc@gmail.com> --- drivers/gpio/gpio-davinci.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/drivers/gpio/gpio-davinci.c b/drivers/gpio/gpio-davinci.c index caeecfc3df20..751c0e3a9676 100644 --- a/drivers/gpio/gpio-davinci.c +++ b/drivers/gpio/gpio-davinci.c @@ -550,6 +550,13 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev) * Or, AINTC can handle IRQs for banks of 16 GPIO IRQs, which we * then chain through our own handler. */ + irqdata = devm_kcalloc(dev, DIV_ROUND_UP(ngpio, 16), + sizeof(*irqdata), GFP_KERNEL); + if (!irqdata) { + irq_domain_remove(chips->irq_domain); + return -ENOMEM; + } + for (gpio = 0, bank = 0; gpio < ngpio; bank++, gpio += 16) { /* disabled by default, enabled only as needed * There are register sets for 32 GPIOs. 2 banks of 16 @@ -564,21 +571,12 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev) * gpio irqs. Pass the irq bank's corresponding controller to * the chained irq handler. */ - irqdata = devm_kzalloc(&pdev->dev, - sizeof(struct - davinci_gpio_irq_data), - GFP_KERNEL); - if (!irqdata) { - irq_domain_remove(chips->irq_domain); - return -ENOMEM; - } - - irqdata->regs = g; - irqdata->bank_num = bank; - irqdata->chip = chips; + irqdata[bank].regs = g; + irqdata[bank].bank_num = bank; + irqdata[bank].chip = chips; irq_set_chained_handler_and_data(chips->irqs[bank], - gpio_irq_handler, irqdata); + gpio_irq_handler, &irqdata[bank]); binten |= BIT(bank); } -- 2.43.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-11-10 23:20 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-11-09 19:49 [PATCH 0/2] gpio: davinci: fix probe-time IRQ setup Sahaj Chaudhari 2026-11-09 19:49 ` [PATCH 1/2] gpio: davinci: use controller-specific MMIO for BINTEN Sahaj Chaudhari 2026-11-10 23:20 ` sashiko-bot 2026-11-09 19:49 ` [PATCH 2/2] gpio: davinci: allocate bank IRQ data before installing handlers Sahaj Chaudhari
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.