Skip to content

gpio: mcp23s08: use edge-triggered interrupts - #48

Merged
evgeny-boger merged 1 commit into
dev/v4.9.xfrom
bugfix/mcp23s08_irq_edge
Mar 7, 2021
Merged

gpio: mcp23s08: use edge-triggered interrupts#48
evgeny-boger merged 1 commit into
dev/v4.9.xfrom
bugfix/mcp23s08_irq_edge

Conversation

@evgeny-boger

Copy link
Copy Markdown
Member

This prevents deadlock on startup when INT line is held low during
startup of mcp23s08 module. Interrupt is cleared by talking to all
mcp23s08 devices sharing same INT line. On startup, the devieces
are probed one by one. The first device probed initialize IRQ handler
on INT line. Since the other deviecs sharing INT line are not probed
at this point, interrupt cannot be cleared.
Continuos interrupt handling, in turn, will prevent other devices to
be probed by blocking i2c bus.

Edge triggered interrupts are triggered only once, thus preventing the
aforementioned scenario.

s in this case interrupt can't be cleared

This prevents deadlock on startup when INT line is held low during
startup of mcp23s08 module. Interrupt is cleared by talking to all
mcp23s08 devices sharing same INT line. On startup, the devieces
are probed one by one. The first device probed initialize IRQ handler
on INT line. Since the other deviecs sharing INT line are not probed
at this point, interrupt cannot be cleared.
Continuos interrupt handling, in turn, will prevent other devices to
be probed by blocking i2c bus.

Edge triggered interrupts are triggered only once, thus preventing the
aforementioned scenario.

s in this case interrupt can't be cleared
@evgeny-boger
evgeny-boger requested a review from webconn February 24, 2021 10:47
@evgeny-boger
evgeny-boger merged commit 31ebc82 into dev/v4.9.x Mar 7, 2021
@evgeny-boger
evgeny-boger deleted the bugfix/mcp23s08_irq_edge branch March 7, 2021 20:46
taraant pushed a commit that referenced this pull request Jun 9, 2025
… prevent wrong idmap generation

commit 363cd2b upstream.

The PTE_MAYBE_NG macro sets the nG page table bit according to the value
of "arm64_use_ng_mappings". This variable is currently placed in the
.bss section. create_init_idmap() is called before the .bss section
initialisation which is done in early_map_kernel(). Therefore,
data/test_prot in create_init_idmap() could be set incorrectly through
the PAGE_KERNEL -> PROT_DEFAULT -> PTE_MAYBE_NG macros.

   # llvm-objdump-21 --syms vmlinux-gcc | grep arm64_use_ng_mappings
     ffff800082f242a8 g     O .bss    0000000000000001 arm64_use_ng_mappings

The create_init_idmap() function disassembly compiled with llvm-21:

  // create_init_idmap()
  ffff80008255c058: d10103ff     	sub	sp, sp, #0x40
  ffff80008255c05c: a9017bfd     	stp	x29, x30, [sp, #0x10]
  ffff80008255c060: a90257f6     	stp	x22, x21, [sp, #0x20]
  ffff80008255c064: a9034ff4     	stp	x20, x19, [sp, #0x30]
  ffff80008255c068: 910043fd     	add	x29, sp, #0x10
  ffff80008255c06c: 90003fc8     	adrp	x8, 0xffff800082d54000
  ffff80008255c070: d280e06a     	mov	x10, #0x703     // =1795
  ffff80008255c074: 91400409     	add	x9, x0, #0x1, lsl #12 // =0x1000
  ffff80008255c078: 394a4108     	ldrb	w8, [x8, #0x290] ------------- (1)
  ffff80008255c07c: f2e00d0a     	movk	x10, #0x68, lsl #48
  ffff80008255c080: f90007e9     	str	x9, [sp, #0x8]
  ffff80008255c084: aa0103f3     	mov	x19, x1
  ffff80008255c088: aa0003f4     	mov	x20, x0
  ffff80008255c08c: 14000000     	b	0xffff80008255c08c <__pi_create_init_idmap+0x34>
  ffff80008255c090: aa082d56     	orr	x22, x10, x8, lsl #11 -------- (2)

Note (1) is loading the arm64_use_ng_mappings value in w8 and (2) is set
the text or data prot with the w8 value to set PTE_NG bit. If the .bss
section isn't initialized, x8 could include a garbage value and generate
an incorrect mapping.

Annotate arm64_use_ng_mappings as __read_mostly so that it is placed in
the .data section.

Fixes: 84b04d3 ("arm64: kernel: Create initial ID map from C code")
Cc: stable@vger.kernel.org # 6.9.x
Tested-by: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
Link: https://lore.kernel.org/r/20250502180412.3774883-1-yeoreum.yun@arm.com
[catalin.marinas@arm.com: use __read_mostly instead of __ro_after_init]
[catalin.marinas@arm.com: slight tweaking of the code comment]
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant