* [PATCH v4 1/6] of/irq: Export of_irq_count for modules
2025-06-20 18:17 [PATCH v4 0/6] Add module support for Arm64 Exynos MCT driver Will McVicker
@ 2025-06-20 18:17 ` Will McVicker
2025-06-20 18:17 ` [PATCH v4 2/6] clocksource/drivers/exynos_mct: Don't register as a sched_clock on arm64 Will McVicker
` (5 subsequent siblings)
6 siblings, 0 replies; 18+ messages in thread
From: Will McVicker @ 2025-06-20 18:17 UTC (permalink / raw)
To: Catalin Marinas, Will Deacon, Daniel Lezcano, Thomas Gleixner,
Krzysztof Kozlowski, Alim Akhtar, Rob Herring, Saravana Kannan
Cc: Will McVicker, Donghoon Yu, Hosung Kim, kernel-team,
linux-arm-kernel, linux-kernel, John Stultz, Youngmin Nam,
Peter Griffin, Tudor Ambarus, André Draszik, Conor Dooley,
linux-samsung-soc, devicetree, Arnd Bergmann, Linus Walleij
Need to export `of_irq_count` in preparation for modularizing the Exynos
MCT driver which uses this API for setting up the timer IRQs.
Acked-by: Rob Herring (Arm) <robh@kernel.org>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Reviewed-by: Linus Walleij <linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
Reviewed-by: Youngmin Nam <youngmin.nam@samsung.com>
Tested-by: Youngmin Nam <youngmin.nam@samsung.com>
Signed-off-by: Will McVicker <willmcvicker@google.com>
---
drivers/of/irq.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/of/irq.c b/drivers/of/irq.c
index f8ad79b9b1c9..5adda1dac3cf 100644
--- a/drivers/of/irq.c
+++ b/drivers/of/irq.c
@@ -519,6 +519,7 @@ int of_irq_count(struct device_node *dev)
return nr;
}
+EXPORT_SYMBOL_GPL(of_irq_count);
/**
* of_irq_to_resource_table - Fill in resource table with node's IRQ info
--
2.50.0.rc2.761.g2dc52ea45b-goog
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v4 2/6] clocksource/drivers/exynos_mct: Don't register as a sched_clock on arm64
2025-06-20 18:17 [PATCH v4 0/6] Add module support for Arm64 Exynos MCT driver Will McVicker
2025-06-20 18:17 ` [PATCH v4 1/6] of/irq: Export of_irq_count for modules Will McVicker
@ 2025-06-20 18:17 ` Will McVicker
2025-06-20 18:17 ` [PATCH v4 3/6] clocksource/drivers/exynos_mct: Set local timer interrupts as percpu Will McVicker
` (4 subsequent siblings)
6 siblings, 0 replies; 18+ messages in thread
From: Will McVicker @ 2025-06-20 18:17 UTC (permalink / raw)
To: Catalin Marinas, Will Deacon, Daniel Lezcano, Thomas Gleixner,
Krzysztof Kozlowski, Alim Akhtar, Rob Herring, Saravana Kannan
Cc: Will McVicker, Donghoon Yu, Hosung Kim, kernel-team,
linux-arm-kernel, linux-kernel, John Stultz, Youngmin Nam,
Peter Griffin, Tudor Ambarus, André Draszik, Conor Dooley,
linux-samsung-soc, devicetree
The MCT register is unfortunately very slow to access, but importantly
does not halt in the c2 idle state. So for ARM64, we can improve
performance by not registering the MCT for sched_clock, allowing the
system to use the faster ARM architected timer for sched_clock instead.
The MCT is still registered as a clocksource, and a clockevent in order
to be a wakeup source for the arch_timer to exit the "c2" idle state.
Since ARM32 SoCs don't have an architected timer, the MCT must continue
to be used for sched_clock. Detailed discussion on this topic can be
found at [1].
[1] https://lore.kernel.org/linux-samsung-soc/1400188079-21832-1-git-send-email-chirantan@chromium.org/
[Original commit from https://android.googlesource.com/kernel/gs/+/630817f7080e92c5e0216095ff52f6eb8dd00727
Signed-off-by: Donghoon Yu <hoony.yu@samsung.com>
Signed-off-by: Youngmin Nam <youngmin.nam@samsung.com>
Reviewed-by: Youngmin Nam <youngmin.nam@samsung.com>
Acked-by: John Stultz <jstultz@google.com>
Tested-by: Youngmin Nam <youngmin.nam@samsung.com>
Signed-off-by: Will McVicker <willmcvicker@google.com>
---
drivers/clocksource/exynos_mct.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
index da09f467a6bb..96361d5dc57d 100644
--- a/drivers/clocksource/exynos_mct.c
+++ b/drivers/clocksource/exynos_mct.c
@@ -219,12 +219,18 @@ static struct clocksource mct_frc = {
.resume = exynos4_frc_resume,
};
+/*
+ * Since ARM devices do not have an architected timer, they need to continue
+ * using the MCT as the main clocksource for timekeeping, sched_clock, and the
+ * delay timer. For AARCH64 SoCs, the architected timer is the preferred
+ * clocksource due to it's superior performance.
+ */
+#if defined(CONFIG_ARM)
static u64 notrace exynos4_read_sched_clock(void)
{
return exynos4_read_count_32();
}
-#if defined(CONFIG_ARM)
static struct delay_timer exynos4_delay_timer;
static cycles_t exynos4_read_current_timer(void)
@@ -250,12 +256,13 @@ static int __init exynos4_clocksource_init(bool frc_shared)
exynos4_delay_timer.read_current_timer = &exynos4_read_current_timer;
exynos4_delay_timer.freq = clk_rate;
register_current_timer_delay(&exynos4_delay_timer);
+
+ sched_clock_register(exynos4_read_sched_clock, 32, clk_rate);
#endif
if (clocksource_register_hz(&mct_frc, clk_rate))
panic("%s: can't register clocksource\n", mct_frc.name);
- sched_clock_register(exynos4_read_sched_clock, 32, clk_rate);
return 0;
}
--
2.50.0.rc2.761.g2dc52ea45b-goog
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v4 3/6] clocksource/drivers/exynos_mct: Set local timer interrupts as percpu
2025-06-20 18:17 [PATCH v4 0/6] Add module support for Arm64 Exynos MCT driver Will McVicker
2025-06-20 18:17 ` [PATCH v4 1/6] of/irq: Export of_irq_count for modules Will McVicker
2025-06-20 18:17 ` [PATCH v4 2/6] clocksource/drivers/exynos_mct: Don't register as a sched_clock on arm64 Will McVicker
@ 2025-06-20 18:17 ` Will McVicker
2025-08-26 13:51 ` Marek Szyprowski
2025-06-20 18:17 ` [PATCH v4 4/6] clocksource/drivers/exynos_mct: Fix uninitialized irq name warning Will McVicker
` (3 subsequent siblings)
6 siblings, 1 reply; 18+ messages in thread
From: Will McVicker @ 2025-06-20 18:17 UTC (permalink / raw)
To: Catalin Marinas, Will Deacon, Daniel Lezcano, Thomas Gleixner,
Krzysztof Kozlowski, Alim Akhtar, Rob Herring, Saravana Kannan
Cc: Will McVicker, Donghoon Yu, Hosung Kim, kernel-team,
linux-arm-kernel, linux-kernel, John Stultz, Youngmin Nam,
Peter Griffin, Tudor Ambarus, André Draszik, Conor Dooley,
linux-samsung-soc, devicetree
From: Hosung Kim <hosung0.kim@samsung.com>
To allow the CPU to handle it's own clock events, we need to set the
IRQF_PERCPU flag. This prevents the local timer interrupts from
migrating to other CPUs.
Signed-off-by: Hosung Kim <hosung0.kim@samsung.com>
[Original commit from https://android.googlesource.com/kernel/gs/+/03267fad19f093bac979ca78309483e9eb3a8d16]
Reviewed-by: Peter Griffin <peter.griffin@linaro.org>
Reviewed-by: Youngmin Nam <youngmin.nam@samsung.com>
Tested-by: Youngmin Nam <youngmin.nam@samsung.com>
Signed-off-by: Will McVicker <willmcvicker@google.com>
---
drivers/clocksource/exynos_mct.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
index 96361d5dc57d..a5ef7d64b1c2 100644
--- a/drivers/clocksource/exynos_mct.c
+++ b/drivers/clocksource/exynos_mct.c
@@ -596,7 +596,8 @@ static int __init exynos4_timer_interrupts(struct device_node *np,
irq_set_status_flags(mct_irq, IRQ_NOAUTOEN);
if (request_irq(mct_irq,
exynos4_mct_tick_isr,
- IRQF_TIMER | IRQF_NOBALANCING,
+ IRQF_TIMER | IRQF_NOBALANCING |
+ IRQF_PERCPU,
pcpu_mevt->name, pcpu_mevt)) {
pr_err("exynos-mct: cannot register IRQ (cpu%d)\n",
cpu);
--
2.50.0.rc2.761.g2dc52ea45b-goog
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH v4 3/6] clocksource/drivers/exynos_mct: Set local timer interrupts as percpu
2025-06-20 18:17 ` [PATCH v4 3/6] clocksource/drivers/exynos_mct: Set local timer interrupts as percpu Will McVicker
@ 2025-08-26 13:51 ` Marek Szyprowski
0 siblings, 0 replies; 18+ messages in thread
From: Marek Szyprowski @ 2025-08-26 13:51 UTC (permalink / raw)
To: Will McVicker, Catalin Marinas, Will Deacon, Daniel Lezcano,
Thomas Gleixner, Krzysztof Kozlowski, Alim Akhtar, Rob Herring,
Saravana Kannan
Cc: Donghoon Yu, kernel-team, linux-arm-kernel, linux-kernel,
John Stultz, Youngmin Nam, Peter Griffin, Tudor Ambarus,
André Draszik, Conor Dooley, linux-samsung-soc, devicetree
On 20.06.2025 20:17, Will McVicker wrote:
> From: Hosung Kim <hosung0.kim@samsung.com>
>
> To allow the CPU to handle it's own clock events, we need to set the
> IRQF_PERCPU flag. This prevents the local timer interrupts from
> migrating to other CPUs.
>
> Signed-off-by: Hosung Kim <hosung0.kim@samsung.com>
> [Original commit from https://android.googlesource.com/kernel/gs/+/03267fad19f093bac979ca78309483e9eb3a8d16]
> Reviewed-by: Peter Griffin <peter.griffin@linaro.org>
> Reviewed-by: Youngmin Nam <youngmin.nam@samsung.com>
> Tested-by: Youngmin Nam <youngmin.nam@samsung.com>
> Signed-off-by: Will McVicker <willmcvicker@google.com>
This patch has been merged some time ago to v6.17-rc1 as commit
f3cec54ee3bf ("clocksource/drivers/exynos_mct: Set local timer
interrupts as percpu"). Recently I found that it breaks CPU hotplug
support for some 'little' cores on Exynos5422 based boards, like
OdroidXU3/XU4:
# for i in /sys/devices/system/cpu/cpu[1-9]; do echo 0 >$i/online; done
# for i in /sys/devices/system/cpu/cpu[1-9]; do echo 1 >$i/online; done
[ 117.100195] CPU2: failed to come online
-bash: echo: write error: Input/output error
[ 118.140426] CPU3: failed to come online
-bash: echo: write error: Input/output error
[ 118.148428] CPU4: detected I-Cache line size mismatch, workaround
enabled
[ 118.169613] CPU5: detected I-Cache line size mismatch, workaround
enabled
[ 118.216802] CPU6: detected I-Cache line size mismatch, workaround
enabled
[ 118.283725] CPU7: detected I-Cache line size mismatch, workaround
enabled
#
Frankly speaking I have no idea why this happens. CPU hotplug was always
broken for the CPU0, but this is not relevant for this case. Maybe this
PERCPU flag should be applied only on ARM64-based boards to avoid
affecting legacy ARM 32bit cases?
> ---
> drivers/clocksource/exynos_mct.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
> index 96361d5dc57d..a5ef7d64b1c2 100644
> --- a/drivers/clocksource/exynos_mct.c
> +++ b/drivers/clocksource/exynos_mct.c
> @@ -596,7 +596,8 @@ static int __init exynos4_timer_interrupts(struct device_node *np,
> irq_set_status_flags(mct_irq, IRQ_NOAUTOEN);
> if (request_irq(mct_irq,
> exynos4_mct_tick_isr,
> - IRQF_TIMER | IRQF_NOBALANCING,
> + IRQF_TIMER | IRQF_NOBALANCING |
> + IRQF_PERCPU,
> pcpu_mevt->name, pcpu_mevt)) {
> pr_err("exynos-mct: cannot register IRQ (cpu%d)\n",
> cpu);
Best regards
--
Marek Szyprowski, PhD
Samsung R&D Institute Poland
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v4 4/6] clocksource/drivers/exynos_mct: Fix uninitialized irq name warning
2025-06-20 18:17 [PATCH v4 0/6] Add module support for Arm64 Exynos MCT driver Will McVicker
` (2 preceding siblings ...)
2025-06-20 18:17 ` [PATCH v4 3/6] clocksource/drivers/exynos_mct: Set local timer interrupts as percpu Will McVicker
@ 2025-06-20 18:17 ` Will McVicker
2025-06-20 18:17 ` [PATCH v4 5/6] clocksource/drivers/exynos_mct: Add module support Will McVicker
` (2 subsequent siblings)
6 siblings, 0 replies; 18+ messages in thread
From: Will McVicker @ 2025-06-20 18:17 UTC (permalink / raw)
To: Catalin Marinas, Will Deacon, Daniel Lezcano, Thomas Gleixner,
Krzysztof Kozlowski, Alim Akhtar, Rob Herring, Saravana Kannan
Cc: Will McVicker, Donghoon Yu, Hosung Kim, kernel-team,
linux-arm-kernel, linux-kernel, John Stultz, Youngmin Nam,
Peter Griffin, Tudor Ambarus, André Draszik, Conor Dooley,
linux-samsung-soc, devicetree
The Exynos MCT driver doesn't set the clocksource name until the CPU
hotplug state is setup which happens after the IRQs are requested. This
results in an empty IRQ name which leads to the below warning at
proc_create() time. When this happens, the userdata partition fails to
mount and the device gets stuck in an endless loop printing the error:
root '/dev/disk/by-partlabel/userdata' doesn't exist or does not contain a /dev.
To fix this, we just need to initialize the name before requesting the
IRQs.
Warning from Pixel 6 kernel log:
[ T430] name len 0
[ T430] WARNING: CPU: 6 PID: 430 at fs/proc/generic.c:407 __proc_create+0x258/0x2b4
[ T430] Modules linked in: dwc3_exynos(E+)
[ T430] ufs_exynos(E+) phy_exynos_ufs(E)
[ T430] phy_exynos5_usbdrd(E) exynos_usi(E+) exynos_mct(E+) s3c2410_wdt(E)
[ T430] arm_dsu_pmu(E) simplefb(E)
[ T430] CPU: 6 UID: 0 PID: 430 Comm: (udev-worker) Tainted:
... 6.14.0-next-20250331-4k-00008-g59adf909e40e #1 ...
[ T430] Tainted: [W]=WARN, [E]=UNSIGNED_MODULE
[ T430] Hardware name: Raven (DT)
[...]
[ T430] Call trace:
[ T430] __proc_create+0x258/0x2b4 (P)
[ T430] proc_mkdir+0x40/0xa0
[ T430] register_handler_proc+0x118/0x140
[ T430] __setup_irq+0x460/0x6d0
[ T430] request_threaded_irq+0xcc/0x1b0
[ T430] mct_init_dt+0x244/0x604 [exynos_mct ...]
[ T430] mct_init_spi+0x18/0x34 [exynos_mct ...]
[ T430] exynos4_mct_probe+0x30/0x4c [exynos_mct ...]
[ T430] platform_probe+0x6c/0xe4
[ T430] really_probe+0xf4/0x38c
[...]
[ T430] driver_register+0x6c/0x140
[ T430] __platform_driver_register+0x28/0x38
[ T430] exynos4_mct_driver_init+0x24/0xfe8 [exynos_mct ...]
[ T430] do_one_initcall+0x84/0x3c0
[ T430] do_init_module+0x58/0x208
[ T430] load_module+0x1de0/0x2500
[ T430] init_module_from_file+0x8c/0xdc
Reviewed-by: Peter Griffin <peter.griffin@linaro.org>
Reviewed-by: Youngmin Nam <youngmin.nam@samsung.com>
Tested-by: Youngmin Nam <youngmin.nam@samsung.com>
Signed-off-by: Will McVicker <willmcvicker@google.com>
---
drivers/clocksource/exynos_mct.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
index a5ef7d64b1c2..62febeb4e1de 100644
--- a/drivers/clocksource/exynos_mct.c
+++ b/drivers/clocksource/exynos_mct.c
@@ -465,8 +465,6 @@ static int exynos4_mct_starting_cpu(unsigned int cpu)
per_cpu_ptr(&percpu_mct_tick, cpu);
struct clock_event_device *evt = &mevt->evt;
- snprintf(mevt->name, sizeof(mevt->name), "mct_tick%d", cpu);
-
evt->name = mevt->name;
evt->cpumask = cpumask_of(cpu);
evt->set_next_event = exynos4_tick_set_next_event;
@@ -567,6 +565,14 @@ static int __init exynos4_timer_interrupts(struct device_node *np,
for (i = MCT_L0_IRQ; i < nr_irqs; i++)
mct_irqs[i] = irq_of_parse_and_map(np, i);
+ for_each_possible_cpu(cpu) {
+ struct mct_clock_event_device *mevt =
+ per_cpu_ptr(&percpu_mct_tick, cpu);
+
+ snprintf(mevt->name, sizeof(mevt->name), "mct_tick%d",
+ cpu);
+ }
+
if (mct_int_type == MCT_INT_PPI) {
err = request_percpu_irq(mct_irqs[MCT_L0_IRQ],
--
2.50.0.rc2.761.g2dc52ea45b-goog
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v4 5/6] clocksource/drivers/exynos_mct: Add module support
2025-06-20 18:17 [PATCH v4 0/6] Add module support for Arm64 Exynos MCT driver Will McVicker
` (3 preceding siblings ...)
2025-06-20 18:17 ` [PATCH v4 4/6] clocksource/drivers/exynos_mct: Fix uninitialized irq name warning Will McVicker
@ 2025-06-20 18:17 ` Will McVicker
2025-06-24 13:48 ` Daniel Lezcano
` (2 more replies)
2025-06-20 18:17 ` [PATCH v4 6/6] arm64: exynos: Drop select CLKSRC_EXYNOS_MCT Will McVicker
2025-07-15 11:03 ` [PATCH v4 0/6] Add module support for Arm64 Exynos MCT driver Daniel Lezcano
6 siblings, 3 replies; 18+ messages in thread
From: Will McVicker @ 2025-06-20 18:17 UTC (permalink / raw)
To: Catalin Marinas, Will Deacon, Daniel Lezcano, Thomas Gleixner,
Krzysztof Kozlowski, Alim Akhtar, Rob Herring, Saravana Kannan
Cc: Will McVicker, Donghoon Yu, Hosung Kim, kernel-team,
linux-arm-kernel, linux-kernel, John Stultz, Youngmin Nam,
Peter Griffin, Tudor Ambarus, André Draszik, Conor Dooley,
linux-samsung-soc, devicetree
From: Donghoon Yu <hoony.yu@samsung.com>
On Arm64 platforms the Exynos MCT driver can be built as a module. On
boot (and even after boot) the arch_timer is used as the clocksource and
tick timer. Once the MCT driver is loaded, it can be used as the wakeup
source for the arch_timer.
Signed-off-by: Donghoon Yu <hoony.yu@samsung.com>
Signed-off-by: Youngmin Nam <youngmin.nam@samsung.com>
[original commit from https://android.googlesource.com/kernel/gs/+/8a52a8288ec7d88ff78f0b37480dbb0e9c65bbfd]
Reviewed-by: Youngmin Nam <youngmin.nam@samsung.com>
Tested-by: Youngmin Nam <youngmin.nam@samsung.com>
Signed-off-by: Will McVicker <willmcvicker@google.com>
---
drivers/clocksource/Kconfig | 3 +-
drivers/clocksource/exynos_mct.c | 51 ++++++++++++++++++++++++++------
2 files changed, 44 insertions(+), 10 deletions(-)
diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index 645f517a1ac2..d657c8ddc96b 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -451,7 +451,8 @@ config ATMEL_TCB_CLKSRC
Support for Timer Counter Blocks on Atmel SoCs.
config CLKSRC_EXYNOS_MCT
- bool "Exynos multi core timer driver" if COMPILE_TEST
+ tristate "Exynos multi core timer driver" if ARM64
+ default y if ARCH_EXYNOS || COMPILE_TEST
depends on ARM || ARM64
depends on ARCH_ARTPEC || ARCH_EXYNOS || COMPILE_TEST
help
diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
index 62febeb4e1de..5075ebe052a7 100644
--- a/drivers/clocksource/exynos_mct.c
+++ b/drivers/clocksource/exynos_mct.c
@@ -15,9 +15,11 @@
#include <linux/cpu.h>
#include <linux/delay.h>
#include <linux/percpu.h>
+#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_irq.h>
#include <linux/of_address.h>
+#include <linux/platform_device.h>
#include <linux/clocksource.h>
#include <linux/sched_clock.h>
@@ -217,6 +219,7 @@ static struct clocksource mct_frc = {
.mask = CLOCKSOURCE_MASK(32),
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
.resume = exynos4_frc_resume,
+ .owner = THIS_MODULE,
};
/*
@@ -241,7 +244,7 @@ static cycles_t exynos4_read_current_timer(void)
}
#endif
-static int __init exynos4_clocksource_init(bool frc_shared)
+static int exynos4_clocksource_init(bool frc_shared)
{
/*
* When the frc is shared, the main processor should have already
@@ -336,6 +339,7 @@ static struct clock_event_device mct_comp_device = {
.set_state_oneshot = mct_set_state_shutdown,
.set_state_oneshot_stopped = mct_set_state_shutdown,
.tick_resume = mct_set_state_shutdown,
+ .owner = THIS_MODULE,
};
static irqreturn_t exynos4_mct_comp_isr(int irq, void *dev_id)
@@ -476,6 +480,7 @@ static int exynos4_mct_starting_cpu(unsigned int cpu)
evt->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT |
CLOCK_EVT_FEAT_PERCPU;
evt->rating = MCT_CLKEVENTS_RATING;
+ evt->owner = THIS_MODULE;
exynos4_mct_write(TICK_BASE_CNT, mevt->base + MCT_L_TCNTB_OFFSET);
@@ -511,7 +516,7 @@ static int exynos4_mct_dying_cpu(unsigned int cpu)
return 0;
}
-static int __init exynos4_timer_resources(struct device_node *np)
+static int exynos4_timer_resources(struct device_node *np)
{
struct clk *mct_clk, *tick_clk;
@@ -539,7 +544,7 @@ static int __init exynos4_timer_resources(struct device_node *np)
* @local_idx: array mapping CPU numbers to local timer indices
* @nr_local: size of @local_idx array
*/
-static int __init exynos4_timer_interrupts(struct device_node *np,
+static int exynos4_timer_interrupts(struct device_node *np,
unsigned int int_type,
const u32 *local_idx,
size_t nr_local)
@@ -652,7 +657,7 @@ static int __init exynos4_timer_interrupts(struct device_node *np,
return err;
}
-static int __init mct_init_dt(struct device_node *np, unsigned int int_type)
+static int mct_init_dt(struct device_node *np, unsigned int int_type)
{
bool frc_shared = of_property_read_bool(np, "samsung,frc-shared");
u32 local_idx[MCT_NR_LOCAL] = {0};
@@ -700,15 +705,43 @@ static int __init mct_init_dt(struct device_node *np, unsigned int int_type)
return exynos4_clockevent_init();
}
-
-static int __init mct_init_spi(struct device_node *np)
+static int mct_init_spi(struct device_node *np)
{
return mct_init_dt(np, MCT_INT_SPI);
}
-static int __init mct_init_ppi(struct device_node *np)
+static int mct_init_ppi(struct device_node *np)
{
return mct_init_dt(np, MCT_INT_PPI);
}
-TIMER_OF_DECLARE(exynos4210, "samsung,exynos4210-mct", mct_init_spi);
-TIMER_OF_DECLARE(exynos4412, "samsung,exynos4412-mct", mct_init_ppi);
+
+static int exynos4_mct_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ int (*mct_init)(struct device_node *np);
+
+ mct_init = of_device_get_match_data(dev);
+ if (!mct_init)
+ return -EINVAL;
+
+ return mct_init(dev->of_node);
+}
+
+static const struct of_device_id exynos4_mct_match_table[] = {
+ { .compatible = "samsung,exynos4210-mct", .data = &mct_init_spi, },
+ { .compatible = "samsung,exynos4412-mct", .data = &mct_init_ppi, },
+ {}
+};
+MODULE_DEVICE_TABLE(of, exynos4_mct_match_table);
+
+static struct platform_driver exynos4_mct_driver = {
+ .probe = exynos4_mct_probe,
+ .driver = {
+ .name = "exynos-mct",
+ .of_match_table = exynos4_mct_match_table,
+ },
+};
+module_platform_driver(exynos4_mct_driver);
+
+MODULE_DESCRIPTION("Exynos Multi Core Timer Driver");
+MODULE_LICENSE("GPL");
--
2.50.0.rc2.761.g2dc52ea45b-goog
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH v4 5/6] clocksource/drivers/exynos_mct: Add module support
2025-06-20 18:17 ` [PATCH v4 5/6] clocksource/drivers/exynos_mct: Add module support Will McVicker
@ 2025-06-24 13:48 ` Daniel Lezcano
2025-06-24 23:47 ` William McVicker
2025-07-15 12:18 ` [PATCH] clocksource/drivers/exynos_mct: Fix section mismatch from the module conversion Daniel Lezcano
2025-07-25 9:40 ` [PATCH v4 5/6] clocksource/drivers/exynos_mct: Add module support Daniel Lezcano
2 siblings, 1 reply; 18+ messages in thread
From: Daniel Lezcano @ 2025-06-24 13:48 UTC (permalink / raw)
To: Will McVicker
Cc: Catalin Marinas, Will Deacon, Thomas Gleixner,
Krzysztof Kozlowski, Alim Akhtar, Rob Herring, Saravana Kannan,
Donghoon Yu, Hosung Kim, kernel-team, linux-arm-kernel,
linux-kernel, John Stultz, Youngmin Nam, Peter Griffin,
Tudor Ambarus, André Draszik, Conor Dooley,
linux-samsung-soc, devicetree
On Fri, Jun 20, 2025 at 11:17:08AM -0700, Will McVicker wrote:
> From: Donghoon Yu <hoony.yu@samsung.com>
>
> On Arm64 platforms the Exynos MCT driver can be built as a module. On
> boot (and even after boot) the arch_timer is used as the clocksource and
> tick timer. Once the MCT driver is loaded, it can be used as the wakeup
> source for the arch_timer.
>
> Signed-off-by: Donghoon Yu <hoony.yu@samsung.com>
> Signed-off-by: Youngmin Nam <youngmin.nam@samsung.com>
> [original commit from https://android.googlesource.com/kernel/gs/+/8a52a8288ec7d88ff78f0b37480dbb0e9c65bbfd]
> Reviewed-by: Youngmin Nam <youngmin.nam@samsung.com>
> Tested-by: Youngmin Nam <youngmin.nam@samsung.com>
> Signed-off-by: Will McVicker <willmcvicker@google.com>
> ---
...
> -static int __init mct_init_spi(struct device_node *np)
__init_or_module
> +static int mct_init_spi(struct device_node *np)
> {
> return mct_init_dt(np, MCT_INT_SPI);
> }
>
> -static int __init mct_init_ppi(struct device_node *np)
> +static int mct_init_ppi(struct device_node *np)
> {
> return mct_init_dt(np, MCT_INT_PPI);
> }
> -TIMER_OF_DECLARE(exynos4210, "samsung,exynos4210-mct", mct_init_spi);
> -TIMER_OF_DECLARE(exynos4412, "samsung,exynos4412-mct", mct_init_ppi);
Are you sure this is not going to hurt the ARM platforms ? Here the
timer is enabled very early in the boot process while with this change
the timer will be available later.
> +static int exynos4_mct_probe(struct platform_device *pdev)
> +{
> + struct device *dev = &pdev->dev;
> + int (*mct_init)(struct device_node *np);
> +
> + mct_init = of_device_get_match_data(dev);
> + if (!mct_init)
> + return -EINVAL;
> +
> + return mct_init(dev->of_node);
> +}
> +
> +static const struct of_device_id exynos4_mct_match_table[] = {
> + { .compatible = "samsung,exynos4210-mct", .data = &mct_init_spi, },
> + { .compatible = "samsung,exynos4412-mct", .data = &mct_init_ppi, },
> + {}
> +};
> +MODULE_DEVICE_TABLE(of, exynos4_mct_match_table);
> +
> +static struct platform_driver exynos4_mct_driver = {
> + .probe = exynos4_mct_probe,
> + .driver = {
> + .name = "exynos-mct",
> + .of_match_table = exynos4_mct_match_table,
> + },
> +};
> +module_platform_driver(exynos4_mct_driver);
> +
> +MODULE_DESCRIPTION("Exynos Multi Core Timer Driver");
> +MODULE_LICENSE("GPL");
> --
> 2.50.0.rc2.761.g2dc52ea45b-goog
>
--
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v4 5/6] clocksource/drivers/exynos_mct: Add module support
2025-06-24 13:48 ` Daniel Lezcano
@ 2025-06-24 23:47 ` William McVicker
2025-06-25 9:23 ` Daniel Lezcano
0 siblings, 1 reply; 18+ messages in thread
From: William McVicker @ 2025-06-24 23:47 UTC (permalink / raw)
To: Daniel Lezcano
Cc: Catalin Marinas, Will Deacon, Thomas Gleixner,
Krzysztof Kozlowski, Alim Akhtar, Rob Herring, Saravana Kannan,
Donghoon Yu, Hosung Kim, kernel-team, linux-arm-kernel,
linux-kernel, John Stultz, Youngmin Nam, Peter Griffin,
Tudor Ambarus, André Draszik, Conor Dooley,
linux-samsung-soc, devicetree
On 06/24/2025, Daniel Lezcano wrote:
> On Fri, Jun 20, 2025 at 11:17:08AM -0700, Will McVicker wrote:
> > From: Donghoon Yu <hoony.yu@samsung.com>
> >
> > On Arm64 platforms the Exynos MCT driver can be built as a module. On
> > boot (and even after boot) the arch_timer is used as the clocksource and
> > tick timer. Once the MCT driver is loaded, it can be used as the wakeup
> > source for the arch_timer.
> >
> > Signed-off-by: Donghoon Yu <hoony.yu@samsung.com>
> > Signed-off-by: Youngmin Nam <youngmin.nam@samsung.com>
> > [original commit from https://android.googlesource.com/kernel/gs/+/8a52a8288ec7d88ff78f0b37480dbb0e9c65bbfd]
> > Reviewed-by: Youngmin Nam <youngmin.nam@samsung.com>
> > Tested-by: Youngmin Nam <youngmin.nam@samsung.com>
> > Signed-off-by: Will McVicker <willmcvicker@google.com>
> > ---
>
> ...
>
> > -static int __init mct_init_spi(struct device_node *np)
>
> __init_or_module
Thanks, I'll update in v5.
>
> > +static int mct_init_spi(struct device_node *np)
> > {
> > return mct_init_dt(np, MCT_INT_SPI);
> > }
> >
> > -static int __init mct_init_ppi(struct device_node *np)
> > +static int mct_init_ppi(struct device_node *np)
> > {
> > return mct_init_dt(np, MCT_INT_PPI);
> > }
> > -TIMER_OF_DECLARE(exynos4210, "samsung,exynos4210-mct", mct_init_spi);
> > -TIMER_OF_DECLARE(exynos4412, "samsung,exynos4412-mct", mct_init_ppi);
>
> Are you sure this is not going to hurt the ARM platforms ? Here the
> timer is enabled very early in the boot process while with this change
> the timer will be available later.
I took a second look at the TIMER_OF_DECLARE() macro and FWICT the timer will
only be enabled "very early" via timer_probe() if "MODULE" is not defined which
is only defined when this specific driver is compiled as a module. Note, this
"MODULE" define is not the same as the Kconfig option "CONFIG_MODULES".
That is why in my v1 and v2 patch [1] I had:
#ifdef MODULE
...
module_platform_driver(exynos4_mct_driver);
#else
TIMER_OF_DECLARE(...)
TIMER_OF_DECLARE(...)
#endif
However, I dropped that since Saravana mentioned that we should not be using
TIMER_OF_DECLARE() for drivers that can be modules. I don't have an ARM Exynos
device to verify dropping TIMER_OF_DECLARE() is safe. So if you and Saravana
agree, I can work on creating a patch to define TIMER_OF_DECLARE_MODULE() like
you proposed in [2] to handle this for all the drivers that are used for both ARM and
ARM64 SoCs.
Thanks,
Will
[1] https://lore.kernel.org/all/6e6b0f5f-ac60-48bb-af6c-fa58658d2639@linaro.org/
[2] https://lore.kernel.org/all/f2f914aa-c554-4135-afaa-f075537ed929@linaro.org/
<snip>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v4 5/6] clocksource/drivers/exynos_mct: Add module support
2025-06-24 23:47 ` William McVicker
@ 2025-06-25 9:23 ` Daniel Lezcano
0 siblings, 0 replies; 18+ messages in thread
From: Daniel Lezcano @ 2025-06-25 9:23 UTC (permalink / raw)
To: William McVicker
Cc: Catalin Marinas, Will Deacon, Thomas Gleixner,
Krzysztof Kozlowski, Alim Akhtar, Rob Herring, Saravana Kannan,
Donghoon Yu, Hosung Kim, kernel-team, linux-arm-kernel,
linux-kernel, John Stultz, Youngmin Nam, Peter Griffin,
Tudor Ambarus, André Draszik, Conor Dooley,
linux-samsung-soc, devicetree
Hi Will,
sorry I missed to add you in Cc but the following proposal help in the
module conversion:
https://lore.kernel.org/all/20250625085715.889837-1-daniel.lezcano@linaro.org/
On 25/06/2025 01:47, William McVicker wrote:
> On 06/24/2025, Daniel Lezcano wrote:
>> On Fri, Jun 20, 2025 at 11:17:08AM -0700, Will McVicker wrote:
>>> From: Donghoon Yu <hoony.yu@samsung.com>
>>>
>>> On Arm64 platforms the Exynos MCT driver can be built as a module. On
>>> boot (and even after boot) the arch_timer is used as the clocksource and
>>> tick timer. Once the MCT driver is loaded, it can be used as the wakeup
>>> source for the arch_timer.
>>>
>>> Signed-off-by: Donghoon Yu <hoony.yu@samsung.com>
>>> Signed-off-by: Youngmin Nam <youngmin.nam@samsung.com>
>>> [original commit from https://android.googlesource.com/kernel/gs/+/8a52a8288ec7d88ff78f0b37480dbb0e9c65bbfd]
>>> Reviewed-by: Youngmin Nam <youngmin.nam@samsung.com>
>>> Tested-by: Youngmin Nam <youngmin.nam@samsung.com>
>>> Signed-off-by: Will McVicker <willmcvicker@google.com>
>>> ---
>>
>> ...
>>
>>> -static int __init mct_init_spi(struct device_node *np)
>>
>> __init_or_module
>
> Thanks, I'll update in v5.
>
>>
>>> +static int mct_init_spi(struct device_node *np)
>>> {
>>> return mct_init_dt(np, MCT_INT_SPI);
>>> }
>>>
>>> -static int __init mct_init_ppi(struct device_node *np)
>>> +static int mct_init_ppi(struct device_node *np)
>>> {
>>> return mct_init_dt(np, MCT_INT_PPI);
>>> }
>>> -TIMER_OF_DECLARE(exynos4210, "samsung,exynos4210-mct", mct_init_spi);
>>> -TIMER_OF_DECLARE(exynos4412, "samsung,exynos4412-mct", mct_init_ppi);
>>
>> Are you sure this is not going to hurt the ARM platforms ? Here the
>> timer is enabled very early in the boot process while with this change
>> the timer will be available later.
>
> I took a second look at the TIMER_OF_DECLARE() macro and FWICT the timer will
> only be enabled "very early" via timer_probe() if "MODULE" is not defined which
> is only defined when this specific driver is compiled as a module. Note, this
> "MODULE" define is not the same as the Kconfig option "CONFIG_MODULES".
> That is why in my v1 and v2 patch [1] I had:
>
> #ifdef MODULE
> ...
> module_platform_driver(exynos4_mct_driver);
> #else
> TIMER_OF_DECLARE(...)
> TIMER_OF_DECLARE(...)
> #endif
>
> However, I dropped that since Saravana mentioned that we should not be using
> TIMER_OF_DECLARE() for drivers that can be modules. I don't have an ARM Exynos
> device to verify dropping TIMER_OF_DECLARE() is safe. So if you and Saravana
> agree, I can work on creating a patch to define TIMER_OF_DECLARE_MODULE() like
> you proposed in [2] to handle this for all the drivers that are used for both ARM and
> ARM64 SoCs.
>
> Thanks,
> Will
>
> [1] https://lore.kernel.org/all/6e6b0f5f-ac60-48bb-af6c-fa58658d2639@linaro.org/
> [2] https://lore.kernel.org/all/f2f914aa-c554-4135-afaa-f075537ed929@linaro.org/
>
> <snip>
--
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH] clocksource/drivers/exynos_mct: Fix section mismatch from the module conversion
2025-06-20 18:17 ` [PATCH v4 5/6] clocksource/drivers/exynos_mct: Add module support Will McVicker
2025-06-24 13:48 ` Daniel Lezcano
@ 2025-07-15 12:18 ` Daniel Lezcano
2025-07-15 17:23 ` William McVicker
` (2 more replies)
2025-07-25 9:40 ` [PATCH v4 5/6] clocksource/drivers/exynos_mct: Add module support Daniel Lezcano
2 siblings, 3 replies; 18+ messages in thread
From: Daniel Lezcano @ 2025-07-15 12:18 UTC (permalink / raw)
To: daniel.lezcano, tglx, willmcvicker
Cc: linux-kernel, Krzysztof Kozlowski, Alim Akhtar,
moderated list:ARM/SAMSUNG S3C, S5P AND EXYNOS ARM ARCHITECTURES,
open list:ARM/SAMSUNG S3C, S5P AND EXYNOS ARM ARCHITECTURES
The function register_current_timer_delay() when compiling on ARM32
fails with a section mismatch. That is resulting from the module
conversion where the function exynos4_clocksource_init() is called
from mct_init_dt(). This one had its __init annotation removed to for
the module loading.
Fix this by adding the __init_or_module annotation for the functions:
- mct_init_dt()
- mct_init_spi()
- mct_init_dt()
Compiled on ARM32 + MODULES=no, ARM64 + MODULES=yes, ARM64 +
MODULES=no
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
drivers/clocksource/exynos_mct.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
index 5075ebe052a7..80d263ee046d 100644
--- a/drivers/clocksource/exynos_mct.c
+++ b/drivers/clocksource/exynos_mct.c
@@ -657,7 +657,7 @@ static int exynos4_timer_interrupts(struct device_node *np,
return err;
}
-static int mct_init_dt(struct device_node *np, unsigned int int_type)
+static __init_or_module int mct_init_dt(struct device_node *np, unsigned int int_type)
{
bool frc_shared = of_property_read_bool(np, "samsung,frc-shared");
u32 local_idx[MCT_NR_LOCAL] = {0};
@@ -705,12 +705,12 @@ static int mct_init_dt(struct device_node *np, unsigned int int_type)
return exynos4_clockevent_init();
}
-static int mct_init_spi(struct device_node *np)
+static __init_or_module int mct_init_spi(struct device_node *np)
{
return mct_init_dt(np, MCT_INT_SPI);
}
-static int mct_init_ppi(struct device_node *np)
+static __init_or_module int mct_init_ppi(struct device_node *np)
{
return mct_init_dt(np, MCT_INT_PPI);
}
--
2.43.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH] clocksource/drivers/exynos_mct: Fix section mismatch from the module conversion
2025-07-15 12:18 ` [PATCH] clocksource/drivers/exynos_mct: Fix section mismatch from the module conversion Daniel Lezcano
@ 2025-07-15 17:23 ` William McVicker
2025-07-18 9:53 ` Arnd Bergmann
2025-07-25 8:48 ` Krzysztof Kozlowski
2 siblings, 0 replies; 18+ messages in thread
From: William McVicker @ 2025-07-15 17:23 UTC (permalink / raw)
To: Daniel Lezcano
Cc: tglx, linux-kernel, Krzysztof Kozlowski, Alim Akhtar,
moderated list:ARM/SAMSUNG S3C, S5P AND EXYNOS ARM ARCHITECTURES,
open list:ARM/SAMSUNG S3C, S5P AND EXYNOS ARM ARCHITECTURES
On 07/15/2025, Daniel Lezcano wrote:
> The function register_current_timer_delay() when compiling on ARM32
> fails with a section mismatch. That is resulting from the module
> conversion where the function exynos4_clocksource_init() is called
> from mct_init_dt(). This one had its __init annotation removed to for
> the module loading.
>
> Fix this by adding the __init_or_module annotation for the functions:
> - mct_init_dt()
> - mct_init_spi()
> - mct_init_dt()
>
> Compiled on ARM32 + MODULES=no, ARM64 + MODULES=yes, ARM64 +
> MODULES=no
>
> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Reviewed-by: Will McVicker <willmcvicker@google.com>
> ---
> drivers/clocksource/exynos_mct.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
> index 5075ebe052a7..80d263ee046d 100644
> --- a/drivers/clocksource/exynos_mct.c
> +++ b/drivers/clocksource/exynos_mct.c
> @@ -657,7 +657,7 @@ static int exynos4_timer_interrupts(struct device_node *np,
> return err;
> }
>
> -static int mct_init_dt(struct device_node *np, unsigned int int_type)
> +static __init_or_module int mct_init_dt(struct device_node *np, unsigned int int_type)
> {
> bool frc_shared = of_property_read_bool(np, "samsung,frc-shared");
> u32 local_idx[MCT_NR_LOCAL] = {0};
> @@ -705,12 +705,12 @@ static int mct_init_dt(struct device_node *np, unsigned int int_type)
> return exynos4_clockevent_init();
> }
>
> -static int mct_init_spi(struct device_node *np)
> +static __init_or_module int mct_init_spi(struct device_node *np)
> {
> return mct_init_dt(np, MCT_INT_SPI);
> }
>
> -static int mct_init_ppi(struct device_node *np)
> +static __init_or_module int mct_init_ppi(struct device_node *np)
> {
> return mct_init_dt(np, MCT_INT_PPI);
> }
> --
> 2.43.0
>
Thanks Daniel for catching this! Sorry I missed it.
Regards,
Will
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH] clocksource/drivers/exynos_mct: Fix section mismatch from the module conversion
2025-07-15 12:18 ` [PATCH] clocksource/drivers/exynos_mct: Fix section mismatch from the module conversion Daniel Lezcano
2025-07-15 17:23 ` William McVicker
@ 2025-07-18 9:53 ` Arnd Bergmann
2025-07-25 8:48 ` Krzysztof Kozlowski
2 siblings, 0 replies; 18+ messages in thread
From: Arnd Bergmann @ 2025-07-18 9:53 UTC (permalink / raw)
To: Daniel Lezcano, Thomas Gleixner, William McVicker
Cc: linux-kernel, Krzysztof Kozlowski, Alim Akhtar,
moderated list:ARM/SAMSUNG S3C, S5P AND EXYNOS ARM ARCHITECTURES,
open list:ARM/SAMSUNG S3C, S5P AND EXYNOS ARM ARCHITECTURES
On Tue, Jul 15, 2025, at 14:18, Daniel Lezcano wrote:
> diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
> index 5075ebe052a7..80d263ee046d 100644
> --- a/drivers/clocksource/exynos_mct.c
> +++ b/drivers/clocksource/exynos_mct.c
> @@ -657,7 +657,7 @@ static int exynos4_timer_interrupts(struct device_node *np,
> return err;
> }
>
> -static int mct_init_dt(struct device_node *np, unsigned int int_type)
> +static __init_or_module int mct_init_dt(struct device_node *np,
> unsigned int int_type)
> {
> bool frc_shared = of_property_read_bool(np, "samsung,frc-shared");
> u32 local_idx[MCT_NR_LOCAL] = {0};
Something still feels off here, though I'm not sure what the best
solution would be. Some observations:
- The exynos4_mct_probe() function is listed as permanent, but
it indirectly calls an __init_or_module function, which is not
technically allowed but does not produce a warning here
because of the indirection.
- if the driver is built-in and the platform_driver picks
up the device, it can be manually unbound and rebound, but the
mct_init_dt() will be discarded at this point.
- In a loadable module, you cannot call register_current_timer_delay(),
since this causes a link failure.
- unloading the module fails to undo the registration, so the
next call to delay(), sched_clock(), ktime_get() or an interrupt
ends up in invalid memory.
I think the driver should use an explicit init function calling
platform_driver_probe(), so the probe is only done at initcall
time and both unbinding and unloading are prevented.
Arnd
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH] clocksource/drivers/exynos_mct: Fix section mismatch from the module conversion
2025-07-15 12:18 ` [PATCH] clocksource/drivers/exynos_mct: Fix section mismatch from the module conversion Daniel Lezcano
2025-07-15 17:23 ` William McVicker
2025-07-18 9:53 ` Arnd Bergmann
@ 2025-07-25 8:48 ` Krzysztof Kozlowski
2025-07-25 8:52 ` Krzysztof Kozlowski
2 siblings, 1 reply; 18+ messages in thread
From: Krzysztof Kozlowski @ 2025-07-25 8:48 UTC (permalink / raw)
To: Daniel Lezcano, tglx, willmcvicker
Cc: linux-kernel, Alim Akhtar,
moderated list:ARM/SAMSUNG S3C, S5P AND EXYNOS ARM ARCHITECTURES,
open list:ARM/SAMSUNG S3C, S5P AND EXYNOS ARM ARCHITECTURES
On 15/07/2025 14:18, Daniel Lezcano wrote:
> The function register_current_timer_delay() when compiling on ARM32
> fails with a section mismatch. That is resulting from the module
> conversion where the function exynos4_clocksource_init() is called
> from mct_init_dt(). This one had its __init annotation removed to for
> the module loading.
>
> Fix this by adding the __init_or_module annotation for the functions:
> - mct_init_dt()
> - mct_init_spi()
> - mct_init_dt()
>
> Compiled on ARM32 + MODULES=no, ARM64 + MODULES=yes, ARM64 +
> MODULES=no
>
> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
> ---
> drivers/clocksource/exynos_mct.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
Did anyone applied this or any other fix?
Next builds are still broken.
https://krzk.eu/#/builders/12/builds/3365
Please revert untested patches if there is no consensus for fixes
It's really surprising that original patchset was not even built by
defconfigs (and I assume it was not even asked to be built by LKP).
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH] clocksource/drivers/exynos_mct: Fix section mismatch from the module conversion
2025-07-25 8:48 ` Krzysztof Kozlowski
@ 2025-07-25 8:52 ` Krzysztof Kozlowski
0 siblings, 0 replies; 18+ messages in thread
From: Krzysztof Kozlowski @ 2025-07-25 8:52 UTC (permalink / raw)
To: Daniel Lezcano, tglx, willmcvicker
Cc: linux-kernel, Alim Akhtar,
moderated list:ARM/SAMSUNG S3C, S5P AND EXYNOS ARM ARCHITECTURES,
open list:ARM/SAMSUNG S3C, S5P AND EXYNOS ARM ARCHITECTURES
On 25/07/2025 10:48, Krzysztof Kozlowski wrote:
> On 15/07/2025 14:18, Daniel Lezcano wrote:
>> The function register_current_timer_delay() when compiling on ARM32
>> fails with a section mismatch. That is resulting from the module
>> conversion where the function exynos4_clocksource_init() is called
>> from mct_init_dt(). This one had its __init annotation removed to for
>> the module loading.
>>
>> Fix this by adding the __init_or_module annotation for the functions:
>> - mct_init_dt()
>> - mct_init_spi()
>> - mct_init_dt()
>>
>> Compiled on ARM32 + MODULES=no, ARM64 + MODULES=yes, ARM64 +
>> MODULES=no
>>
>> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
>> ---
>> drivers/clocksource/exynos_mct.c | 6 +++---
>> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> Did anyone applied this or any other fix?
>
> Next builds are still broken.
> https://krzk.eu/#/builders/12/builds/3365
... and first failure was 9 (!) days ago:
https://krzk.eu/#/builders/12/builds/3350
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v4 5/6] clocksource/drivers/exynos_mct: Add module support
2025-06-20 18:17 ` [PATCH v4 5/6] clocksource/drivers/exynos_mct: Add module support Will McVicker
2025-06-24 13:48 ` Daniel Lezcano
2025-07-15 12:18 ` [PATCH] clocksource/drivers/exynos_mct: Fix section mismatch from the module conversion Daniel Lezcano
@ 2025-07-25 9:40 ` Daniel Lezcano
2 siblings, 0 replies; 18+ messages in thread
From: Daniel Lezcano @ 2025-07-25 9:40 UTC (permalink / raw)
To: Will McVicker, Catalin Marinas, Will Deacon, Thomas Gleixner,
Krzysztof Kozlowski, Alim Akhtar, Rob Herring, Saravana Kannan
Cc: Donghoon Yu, Hosung Kim, kernel-team, linux-arm-kernel,
linux-kernel, John Stultz, Youngmin Nam, Peter Griffin,
Tudor Ambarus, André Draszik, Conor Dooley,
linux-samsung-soc, devicetree
Hi Will,
On 20/06/2025 20:17, Will McVicker wrote:
[ ... ]
> -TIMER_OF_DECLARE(exynos4210, "samsung,exynos4210-mct", mct_init_spi);
> -TIMER_OF_DECLARE(exynos4412, "samsung,exynos4412-mct", mct_init_ppi);
Was these changes tested on the ARM32 Exynos platforms ? Especially did
you check if there is no boot time regression ?
> +static int exynos4_mct_probe(struct platform_device *pdev)
> +{
> + struct device *dev = &pdev->dev;
> + int (*mct_init)(struct device_node *np);
> +
> + mct_init = of_device_get_match_data(dev);
> + if (!mct_init)
> + return -EINVAL;
> +
> + return mct_init(dev->of_node);
> +}
> +
> +static const struct of_device_id exynos4_mct_match_table[] = {
> + { .compatible = "samsung,exynos4210-mct", .data = &mct_init_spi, },
> + { .compatible = "samsung,exynos4412-mct", .data = &mct_init_ppi, },
> + {}
> +};
> +MODULE_DEVICE_TABLE(of, exynos4_mct_match_table);
> +
> +static struct platform_driver exynos4_mct_driver = {
> + .probe = exynos4_mct_probe,
> + .driver = {
> + .name = "exynos-mct",
> + .of_match_table = exynos4_mct_match_table,
> + },
> +};
> +module_platform_driver(exynos4_mct_driver);
> +
> +MODULE_DESCRIPTION("Exynos Multi Core Timer Driver");
> +MODULE_LICENSE("GPL");
--
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v4 6/6] arm64: exynos: Drop select CLKSRC_EXYNOS_MCT
2025-06-20 18:17 [PATCH v4 0/6] Add module support for Arm64 Exynos MCT driver Will McVicker
` (4 preceding siblings ...)
2025-06-20 18:17 ` [PATCH v4 5/6] clocksource/drivers/exynos_mct: Add module support Will McVicker
@ 2025-06-20 18:17 ` Will McVicker
2025-07-15 11:03 ` [PATCH v4 0/6] Add module support for Arm64 Exynos MCT driver Daniel Lezcano
6 siblings, 0 replies; 18+ messages in thread
From: Will McVicker @ 2025-06-20 18:17 UTC (permalink / raw)
To: Catalin Marinas, Will Deacon, Daniel Lezcano, Thomas Gleixner,
Krzysztof Kozlowski, Alim Akhtar, Rob Herring, Saravana Kannan
Cc: Will McVicker, Donghoon Yu, Hosung Kim, kernel-team,
linux-arm-kernel, linux-kernel, John Stultz, Youngmin Nam,
Peter Griffin, Tudor Ambarus, André Draszik, Conor Dooley,
linux-samsung-soc, devicetree
Since the Exynos MCT driver can be built as a module for some Arm64 SoCs
like gs101, drop force-selecting it as a built-in driver by ARCH_EXYNOS
and instead depend on `default y if ARCH_EXYNOS` to select it
automatically. This allows platforms like Android to build the driver as
a module if desired.
Reviewed-by: Youngmin Nam <youngmin.nam@samsung.com>
Tested-by: Youngmin Nam <youngmin.nam@samsung.com>
Signed-off-by: Will McVicker <willmcvicker@google.com>
---
arch/arm64/Kconfig.platforms | 1 -
1 file changed, 1 deletion(-)
diff --git a/arch/arm64/Kconfig.platforms b/arch/arm64/Kconfig.platforms
index a541bb029aa4..46825b02d099 100644
--- a/arch/arm64/Kconfig.platforms
+++ b/arch/arm64/Kconfig.platforms
@@ -109,7 +109,6 @@ config ARCH_BLAIZE
config ARCH_EXYNOS
bool "Samsung Exynos SoC family"
select COMMON_CLK_SAMSUNG
- select CLKSRC_EXYNOS_MCT
select EXYNOS_PM_DOMAINS if PM_GENERIC_DOMAINS
select EXYNOS_PMU
select PINCTRL
--
2.50.0.rc2.761.g2dc52ea45b-goog
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH v4 0/6] Add module support for Arm64 Exynos MCT driver
2025-06-20 18:17 [PATCH v4 0/6] Add module support for Arm64 Exynos MCT driver Will McVicker
` (5 preceding siblings ...)
2025-06-20 18:17 ` [PATCH v4 6/6] arm64: exynos: Drop select CLKSRC_EXYNOS_MCT Will McVicker
@ 2025-07-15 11:03 ` Daniel Lezcano
6 siblings, 0 replies; 18+ messages in thread
From: Daniel Lezcano @ 2025-07-15 11:03 UTC (permalink / raw)
To: Will McVicker
Cc: Catalin Marinas, Will Deacon, Thomas Gleixner,
Krzysztof Kozlowski, Alim Akhtar, Rob Herring, Saravana Kannan,
Donghoon Yu, Hosung Kim, kernel-team, linux-arm-kernel,
linux-kernel, John Stultz, Youngmin Nam, Peter Griffin,
Tudor Ambarus, André Draszik, Conor Dooley,
linux-samsung-soc, devicetree
On Fri, Jun 20, 2025 at 11:17:03AM -0700, Will McVicker wrote:
> This series adds support to build the Arm64 Exynos MCT driver as a module.
> This is only possible on Arm64 SoCs since they can use the Arm architected
> timer as the clocksource. Once the Exynos MCT module is loaded and the
> device probes, the MCT is used as the wakeup source for the arch_timer to
> ensure the device can wakeup from the "c2" idle state.
>
> These patches are originally from the downstream Pixel 6 (gs101) kernel
> found at [1] and have been adapted for upstream. Not only has the Exynos MCT
> driver been shipping as a module in the field with Android, but I've also
> tested this series with the upstream kernel on my Pixel 6 Pro.
>
> In addition, I verified that the Exynos MCT module cannot be unloaded on my
> Pixel 6. This is due to /sys/module/exynos_mct/refcnt > 0. So if you try,
> you'll get this:
>
> root@google-gs:~# rmmod exynos_mct
> rmmod: ERROR: Module exynos_mct is in use
> root@google-gs:~# cat /sys/module/exynos_mct/refcnt
> 9
>
> Thanks,
> Will
>
> Note1, instructions to build and flash a Pixel 6 device with the upstream
> kernel can be found at [2].
>
> Note2, this series is based off of krzk/for-next commit a15edf91668b ("Merge
> branch 'next/dt64' into for-next") with [3] on top.
>
> [1] https://android.googlesource.com/kernel/gs/+log/refs/heads/android-gs-raviole-5.10-android12-d1
> [2] https://git.codelinaro.org/linaro/googlelt/pixelscripts/-/blob/clo/main/README.md?ref_type=heads
> [3] https://lore.kernel.org/linux-arm-kernel/20250602151853.1942521-1-daniel.lezcano@linaro.org/
>
> Cc: Alim Akhtar <alim.akhtar@samsung.com>
> Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
> Cc: Donghoon Yu <hoony.yu@samsung.com>
> Cc: Hosung Kim <hosung0.kim@samsung.com>
> Cc: kernel-team@android.com
> Cc: linux-arm-kernel@lists.infradead.org
> Cc: linux-kernel@vger.kernel.org
> Cc: Rob Herring <robh@kernel.org>
> Cc: Saravana Kannan <saravanak@google.com>
> Cc: John Stultz <jstultz@google.com>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Youngmin Nam <youngmin.nam@samsung.com>
> Cc: Peter Griffin <peter.griffin@linaro.org>
> Cc: Tudor Ambarus <tudor.ambarus@linaro.org>
> Cc: André Draszik <andre.draszik@linaro.org>
> Cc: Will Deacon <will@kernel.org>
> Cc: Conor Dooley <conor+dt@kernel.org>
> Cc: Krzysztof Kozlowski <krzk@kernel.org>
> Cc: linux-samsung-soc@vger.kernel.org
>
> ---
> Changes in v4:
> - Missed the "v3" string in the previous series for the actual patches
> - Re-generated patches with --base a15edf91668beefdb5171c53fa698c9b43dd1e0d
> for kernel test robot.
>
> Changes in v3:
> - Rebased on top of Daniel's timer modularization prep series [3] and
> krzk/for-next commit a15edf91668b ("Merge branch 'next/dt64' into
> for-next")
> - Added owner references to Exynos MCT clocksource and clockevent objects.
> - Dropped #ifdef MODULE conditional section in favor of just using
> module_platform_driver() which will properly handle setting up the
> of_device_id table based on if the driver is built-in or a module.
> - Update commit message for patch 2 based on John's feedback.
> - Dropped DT change from v2 as it was picked up by Krzysztof for CPU Idle.
>
> Changes in v2:
> - Re-worked patch v1 5 based on Rob Herring's review to use the compatible
> data for retrieving the mct_init function pointer.
> - Updated the Kconfig logic to disallow building the Exynos MCT driver as
> a module for ARM32 configurations based on Krzysztof Kozlowski's findings.
> - Added comments and clarified commit messages in patches 1 and 2 based on
> reviews from John Stultz and Youngmin Nam.
> - Fixed an issue found during testing that resulted in the device getting
> stuck on boot. This is included in v2 as patch 5.
> - Collected *-by tags
> - Rebased to the latest linux-next/master.
> ---
Applied, thanks
-- Daniel
--
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
^ permalink raw reply [flat|nested] 18+ messages in thread