17 Apr, 2020

1 commit

  • Running a lockedp-enabled kernel on a vim3l board (Amlogic SM1)
    leads to the following splat:

    [ 13.557138] WARNING: HARDIRQ-safe -> HARDIRQ-unsafe lock order detected
    [ 13.587485] ip/456 [HC0[0]:SC0[0]:HE0:SE1] is trying to acquire:
    [ 13.625922] ffff000059908cf0 (&irq_desc_lock_class){-.-.}-{2:2}, at: __setup_irq+0xf8/0x8d8
    [ 13.632273] which would create a new lock dependency:
    [ 13.637272] (&irq_desc_lock_class){-.-.}-{2:2} -> (&ctl->lock){+.+.}-{2:2}
    [ 13.644209]
    [ 13.644209] but this new dependency connects a HARDIRQ-irq-safe lock:
    [ 13.654122] (&irq_desc_lock_class){-.-.}-{2:2}
    [ 13.654125]
    [ 13.654125] ... which became HARDIRQ-irq-safe at:
    [ 13.664759] lock_acquire+0xec/0x368
    [ 13.666926] _raw_spin_lock+0x60/0x88
    [ 13.669979] handle_fasteoi_irq+0x30/0x178
    [ 13.674082] generic_handle_irq+0x38/0x50
    [ 13.678098] __handle_domain_irq+0x6c/0xc8
    [ 13.682209] gic_handle_irq+0x5c/0xb0
    [ 13.685872] el1_irq+0xd0/0x180
    [ 13.689010] arch_cpu_idle+0x40/0x220
    [ 13.692732] default_idle_call+0x54/0x60
    [ 13.696677] do_idle+0x23c/0x2e8
    [ 13.699903] cpu_startup_entry+0x30/0x50
    [ 13.703852] rest_init+0x1e0/0x2b4
    [ 13.707301] arch_call_rest_init+0x18/0x24
    [ 13.711449] start_kernel+0x4ec/0x51c
    [ 13.715167]
    [ 13.715167] to a HARDIRQ-irq-unsafe lock:
    [ 13.722426] (&ctl->lock){+.+.}-{2:2}
    [ 13.722430]
    [ 13.722430] ... which became HARDIRQ-irq-unsafe at:
    [ 13.732319] ...
    [ 13.732324] lock_acquire+0xec/0x368
    [ 13.735985] _raw_spin_lock+0x60/0x88
    [ 13.739452] meson_gpio_irq_domain_alloc+0xcc/0x290
    [ 13.744392] irq_domain_alloc_irqs_hierarchy+0x24/0x60
    [ 13.749586] __irq_domain_alloc_irqs+0x160/0x2f0
    [ 13.754254] irq_create_fwspec_mapping+0x118/0x320
    [ 13.759073] irq_create_of_mapping+0x78/0xa0
    [ 13.763360] of_irq_get+0x6c/0x80
    [ 13.766701] of_mdiobus_register_phy+0x10c/0x238 [of_mdio]
    [ 13.772227] of_mdiobus_register+0x158/0x380 [of_mdio]
    [ 13.777388] mdio_mux_init+0x180/0x2e8 [mdio_mux]
    [ 13.782128] g12a_mdio_mux_probe+0x290/0x398 [mdio_mux_meson_g12a]
    [ 13.788349] platform_drv_probe+0x5c/0xb0
    [ 13.792379] really_probe+0xe4/0x448
    [ 13.795979] driver_probe_device+0xe8/0x140
    [ 13.800189] __device_attach_driver+0x94/0x120
    [ 13.804639] bus_for_each_drv+0x84/0xd8
    [ 13.808474] __device_attach+0xe4/0x168
    [ 13.812361] device_initial_probe+0x1c/0x28
    [ 13.816592] bus_probe_device+0xa4/0xb0
    [ 13.820430] deferred_probe_work_func+0xa8/0x100
    [ 13.825064] process_one_work+0x264/0x688
    [ 13.829088] worker_thread+0x4c/0x458
    [ 13.832768] kthread+0x154/0x158
    [ 13.836018] ret_from_fork+0x10/0x18
    [ 13.839612]
    [ 13.839612] other info that might help us debug this:
    [ 13.839612]
    [ 13.850354] Possible interrupt unsafe locking scenario:
    [ 13.850354]
    [ 13.855720] CPU0 CPU1
    [ 13.858774] ---- ----
    [ 13.863242] lock(&ctl->lock);
    [ 13.866330] local_irq_disable();
    [ 13.872233] lock(&irq_desc_lock_class);
    [ 13.878705] lock(&ctl->lock);
    [ 13.884297]
    [ 13.886857] lock(&irq_desc_lock_class);
    [ 13.891014]
    [ 13.891014] *** DEADLOCK ***

    The issue can occur when CPU1 is doing something like irq_set_type()
    and CPU0 performing an interrupt allocation, for example. Taking
    an interrupt (like the one being reconfigured) would lead to a deadlock.

    A solution to this is:

    - Reorder the locking so that meson_gpio_irq_update_bits takes the lock
    itself at all times, instead of relying on the caller to lock or not,
    hence making the RMW sequence atomic,

    - Rework the critical section in meson_gpio_irq_request_channel to only
    cover the allocation itself, and let the gpio_irq_sel_pin callback
    deal with its own locking if required,

    - Take the private spin-lock with interrupts disabled at all times

    Reviewed-by: Jerome Brunet
    Signed-off-by: Marc Zyngier

    Marc Zyngier
     

21 Jan, 2020

2 commits

  • The meson a1 Socs have some changes compared with previous
    chips. For A113L, it contains 62 pins and can be spied on:

    - 62:128 undefined
    - 61:50 12 pins on bank A
    - 49:37 13 pins on bank F
    - 36:20 17 pins on bank X
    - 19:13 7 pins on bank B
    - 12:0 13 pins on bank P

    There are five relative registers for gpio interrupt controller,
    details are as below:

    - PADCTRL_GPIO_IRQ_CTRL0
    bit[31]: enable/disable the whole irq lines
    bit[16-23]: both edge trigger
    bit[8-15]: single edge trigger
    bit[0-7]: pol trigger

    - PADCTRL_GPIO_IRQ_CTRL[X]
    bit[0-6]: 7 bits to choose gpio source for irq line 2*[X] - 2
    bit[16-22]: 7 bits to choose gpio source for irq line 2*[X] - 1
    where X =1,2,3,4

    Signed-off-by: Qianggui Song
    Signed-off-by: Marc Zyngier
    Link: https://lore.kernel.org/r/20191216123645.10099-4-qianggui.song@amlogic.com

    Qianggui Song
     
  • Since Meson-A1 SoCs register layout of gpio interrupt controller has
    difference with previous chips, registers to decide irq line and offset
    of trigger method are all changed, the current driver should be modified.

    Signed-off-by: Qianggui Song
    Signed-off-by: Marc Zyngier
    Link: https://lore.kernel.org/r/20191216123645.10099-3-qianggui.song@amlogic.com

    Qianggui Song
     

30 Aug, 2019

1 commit

  • The meson sm1 SoCs uses the same type of GPIO interrupt controller IP
    block as the other meson SoCs, A total of 100 pins can be spied on:

    - 223:100 undefined (no interrupt)
    - 99:97 3 pins on bank GPIOE
    - 96:77 20 pins on bank GPIOX
    - 76:61 16 pins on bank GPIOA
    - 60:53 8 pins on bank GPIOC
    - 52:37 16 pins on bank BOOT
    - 36:28 9 pins on bank GPIOH
    - 27:12 16 pins on bank GPIOZ
    - 11:0 12 pins in the AO domain

    Mapping is the same as the g12a family but the sm1 controller
    allows to trig an irq on both edges of the input signal. This was
    not possible with the previous SoCs families

    Signed-off-by: Jerome Brunet
    Signed-off-by: Marc Zyngier
    Tested-by: Kevin Hilman
    Reviewed-by: Kevin Hilman
    Link: https://lore.kernel.org/r/20190829161635.25067-3-jbrunet@baylibre.com

    Jerome Brunet
     

09 Jul, 2019

1 commit

  • Pull irq updates from Thomas Gleixner:
    "The irq departement provides the usual mixed bag:

    Core:

    - Further improvements to the irq timings code which aims to predict
    the next interrupt for power state selection to achieve better
    latency/power balance

    - Add interrupt statistics to the core NMI handlers

    - The usual small fixes and cleanups

    Drivers:

    - Support for Renesas RZ/A1, Annapurna Labs FIC, Meson-G12A SoC and
    Amazon Gravition AMR/GIC interrupt controllers.

    - Rework of the Renesas INTC controller driver

    - ACPI support for Socionext SoCs

    - Enhancements to the CSKY interrupt controller

    - The usual small fixes and cleanups"

    * 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (39 commits)
    irq/irqdomain: Fix comment typo
    genirq: Update irq stats from NMI handlers
    irqchip/gic-pm: Remove PM_CLK dependency
    irqchip/al-fic: Introduce Amazon's Annapurna Labs Fabric Interrupt Controller Driver
    dt-bindings: interrupt-controller: Add Amazon's Annapurna Labs FIC
    softirq: Use __this_cpu_write() in takeover_tasklets()
    irqchip/mbigen: Stop printing kernel addresses
    irqchip/gic: Add dependency for ARM_GIC_MAX_NR
    genirq/affinity: Remove unused argument from [__]irq_build_affinity_masks()
    genirq/timings: Add selftest for next event computation
    genirq/timings: Add selftest for irqs circular buffer
    genirq/timings: Add selftest for circular array
    genirq/timings: Encapsulate storing function
    genirq/timings: Encapsulate timings push
    genirq/timings: Optimize the period detection speed
    genirq/timings: Fix timings buffer inspection
    genirq/timings: Fix next event index function
    irqchip/qcom: Use struct_size() in devm_kzalloc()
    irqchip/irq-csky-mpintc: Remove unnecessary loop in interrupt handler
    dt-bindings: interrupt-controller: Update csky mpintc
    ...

    Linus Torvalds
     

19 Jun, 2019

1 commit

  • Based on 1 normalized pattern(s):

    this program is free software you can redistribute it and or modify
    it under the terms of version 2 of the gnu general public license as
    published by the free software foundation this program is
    distributed in the hope that it will be useful but without any
    warranty without even the implied warranty of merchantability or
    fitness for a particular purpose see the gnu general public license
    for more details you should have received a copy of the gnu general
    public license along with this program if not see http www gnu org
    licenses the full gnu general public license is included in this
    distribution in the file called copying

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-only

    has been chosen to replace the boilerplate/reference in 4 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Allison Randal
    Reviewed-by: Enrico Weigelt
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190604081202.258730266@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     

11 Jun, 2019

1 commit

  • The Meson-G12A SoC uses the same GPIO interrupt controller IP block as the
    other Meson SoCs, A totle of 100 pins can be spied on, which is the sum of:

    - 223:100 undefined (no interrupt)
    - 99:97 3 pins on bank GPIOE
    - 96:77 20 pins on bank GPIOX
    - 76:61 16 pins on bank GPIOA
    - 60:53 8 pins on bank GPIOC
    - 52:37 16 pins on bank BOOT
    - 36:28 9 pins on bank GPIOH
    - 27:12 16 pins on bank GPIOZ
    - 11:0 12 pins in the AO domain

    Signed-off-by: Xingyu Chen
    Signed-off-by: Jianxin Pan
    Signed-off-by: Martin Blumenstingl
    Signed-off-by: Marc Zyngier

    Xingyu Chen
     

24 May, 2018

1 commit

  • The Meson-AXG SoC uses the same GPIO interrupt controller IP block as the other
    Meson SoCs. A total of 100 pins can be spied on, which is the sum of:
    - 255:100 Undefined(no interrupt)
    - 99:84, 16 pins on bank GPIOY
    - 83:61, 23 pins on bank GPIOX
    - 60:40, 21 pins on bank GPIOA
    - 39:25, 15 pins on bank BOOT
    - 24:14, 11 pins on bank GPIOZ
    - 13:0 , 14 pins in the AO domain

    Signed-off-by: Yixun Lan
    Signed-off-by: Marc Zyngier

    Yixun Lan
     

02 Nov, 2017

1 commit

  • Meson8 uses the same GPIO interrupt controller IP block as the other
    Meson SoCs. A total of 134 pins can be spied on, which is the sum of:
    - 22 pins on bank GPIOX
    - 17 pins on bank GPIOY
    - 30 pins on bank GPIODV
    - 10 pins on bank GPIOH
    - 15 pins on bank GPIOZ
    - 7 pins on bank CARD
    - 19 pins on bank BOOT
    - 14 pins in the AO domain

    Acked-by: Kevin Hilman
    Acked-by: Rob Herring
    Signed-off-by: Martin Blumenstingl
    Signed-off-by: Marc Zyngier

    Martin Blumenstingl
     

19 Oct, 2017

1 commit

  • Add support for the interrupt gpio controller found on Amlogic's meson
    SoC family.

    This controller is a separate controller from the gpio controller. It is
    able to spy on the SoC pad. It is essentially a 256 to 8 router with a
    filtering block to select level or edge and polarity. The number of actual
    mappable inputs depends on the SoC.

    Cc: Heiner Kallweit
    Signed-off-by: Jerome Brunet
    Signed-off-by: Marc Zyngier

    Jerome Brunet