diff options
Diffstat (limited to 'configs/platform-v7a/patches/barebox-2022.04.0/0003-clocksource-assign-non-zero-priorities-to-all-clocks.patch')
-rw-r--r-- | configs/platform-v7a/patches/barebox-2022.04.0/0003-clocksource-assign-non-zero-priorities-to-all-clocks.patch | 492 |
1 files changed, 492 insertions, 0 deletions
diff --git a/configs/platform-v7a/patches/barebox-2022.04.0/0003-clocksource-assign-non-zero-priorities-to-all-clocks.patch b/configs/platform-v7a/patches/barebox-2022.04.0/0003-clocksource-assign-non-zero-priorities-to-all-clocks.patch new file mode 100644 index 0000000..8610985 --- /dev/null +++ b/configs/platform-v7a/patches/barebox-2022.04.0/0003-clocksource-assign-non-zero-priorities-to-all-clocks.patch @@ -0,0 +1,492 @@ +From 4c82930465ae4652ca5eb8cb808873858c1120a2 Mon Sep 17 00:00:00 2001 +From: Ahmad Fatoum <a.fatoum@pengutronix.de> +Date: Fri, 22 Apr 2022 17:22:32 +0200 +Subject: [PATCH 3/5] clocksource: assign non-zero priorities to all + clocksources + +Most barebox clocksources have a zero priority and if multiple of them +exist, but no higher priority ones, the first to call init_clock wins. + +Some supported boards like the Raspberry Pi additionally depended on +initcall ordering to favor one zero-priority clocksource over another. +With the move to deep probe and with Commit b641580deb8c ("of: platform: +Ensure timers are probed early"), device tree blob iteration order could +now dictate which clocksource is ultimately used. This led to a 20 times +slower clock source being chosen on the Raspberry Pi, because the ARM +architected timer was taken instead of the bcm2835 timer. + +Fix the root cause by assigning priorities to all clocksource drivers. +Priorities chosen are: + + 50: device_initcall + 60: coredevice_initcall + 70: postcore_initcall + 80: core_initcall + +These priorities are all below 100, which was previously the lowest +positive priority and as they are positive, they win against the dummy +clocksource. This should ensure no priority inversion happens. + +Fixes: b641580deb8c ("of: platform: Ensure timers are probed early") +Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> +--- + arch/arm/mach-at91/at91rm9200_time.c | 1 + + arch/arm/mach-davinci/time.c | 1 + + arch/arm/mach-ep93xx/clocksource.c | 1 + + arch/arm/mach-mxs/clocksource-imx23.c | 1 + + arch/arm/mach-mxs/clocksource-imx28.c | 1 + + arch/arm/mach-pxa/clocksource.c | 1 + + arch/arm/mach-samsung/s3c-timer.c | 1 + + arch/arm/mach-tegra/tegra20-timer.c | 1 + + arch/arm/mach-versatile/core.c | 1 + + arch/mips/lib/csrc-r4k.c | 1 + + arch/mips/mach-xburst/csrc-jz4750.c | 1 + + arch/openrisc/lib/clock.c | 1 + + arch/powerpc/mach-mpc5xxx/time.c | 1 + + arch/powerpc/mach-mpc85xx/time.c | 1 + + arch/sandbox/board/clock.c | 1 + + drivers/clocksource/amba-sp804.c | 1 + + drivers/clocksource/arm_architected_timer.c | 1 + + drivers/clocksource/arm_global_timer.c | 1 + + drivers/clocksource/arm_smp_twd.c | 1 + + drivers/clocksource/armv7m_systick.c | 1 + + drivers/clocksource/bcm2835.c | 1 + + drivers/clocksource/clps711x.c | 1 + + drivers/clocksource/digic.c | 1 + + drivers/clocksource/dw_apb_timer.c | 1 + + drivers/clocksource/efi.c | 1 + + drivers/clocksource/kvx_timer.c | 1 + + drivers/clocksource/mvebu.c | 1 + + drivers/clocksource/nomadik.c | 1 + + drivers/clocksource/orion.c | 1 + + drivers/clocksource/rk_timer.c | 1 + + drivers/clocksource/timer-atmel-pit.c | 1 + + drivers/clocksource/timer-imx-gpt.c | 1 + + drivers/clocksource/timer-ti-32k.c | 1 + + drivers/clocksource/timer-ti-dm.c | 1 + + drivers/clocksource/uemd.c | 1 + + 35 files changed, 35 insertions(+) + +diff --git a/arch/arm/mach-at91/at91rm9200_time.c b/arch/arm/mach-at91/at91rm9200_time.c +index ccbefbbc33a2..110d77088169 100644 +--- a/arch/arm/mach-at91/at91rm9200_time.c ++++ b/arch/arm/mach-at91/at91rm9200_time.c +@@ -35,6 +35,7 @@ static struct clocksource cs = { + .mask = CLOCKSOURCE_MASK(20), + .read = at91rm9200_clocksource_read, + .shift = 10, ++ .priority = 80, + }; + + static int clocksource_init (void) +diff --git a/arch/arm/mach-davinci/time.c b/arch/arm/mach-davinci/time.c +index 52b3ac3e6823..c54e49470b72 100644 +--- a/arch/arm/mach-davinci/time.c ++++ b/arch/arm/mach-davinci/time.c +@@ -96,6 +96,7 @@ static uint64_t davinci_cs_read(void) + static struct clocksource davinci_cs = { + .read = davinci_cs_read, + .mask = CLOCKSOURCE_MASK(32), ++ .priority = 80, + }; + + static int timer32_config(struct timer_s *t) +diff --git a/arch/arm/mach-ep93xx/clocksource.c b/arch/arm/mach-ep93xx/clocksource.c +index 1f3ff7f8f20a..e2a3a397803f 100644 +--- a/arch/arm/mach-ep93xx/clocksource.c ++++ b/arch/arm/mach-ep93xx/clocksource.c +@@ -37,6 +37,7 @@ static struct clocksource cs = { + .read = ep93xx_clocksource_read, + .mask = CLOCKSOURCE_MASK(32), + .shift = 10, ++ .priority = 80, + }; + + static int clocksource_init(void) +diff --git a/arch/arm/mach-mxs/clocksource-imx23.c b/arch/arm/mach-mxs/clocksource-imx23.c +index 0a6716f87958..ba5aad9f30dc 100644 +--- a/arch/arm/mach-mxs/clocksource-imx23.c ++++ b/arch/arm/mach-mxs/clocksource-imx23.c +@@ -34,6 +34,7 @@ static struct clocksource cs = { + .read = imx23_clocksource_read, + .mask = CLOCKSOURCE_MASK(16), + .shift = 10, ++ .priority = 80, + }; + + static int imx23_clocksource_clock_change(struct notifier_block *nb, unsigned long event, void *data) +diff --git a/arch/arm/mach-mxs/clocksource-imx28.c b/arch/arm/mach-mxs/clocksource-imx28.c +index ea6d4b514630..65d8155ad244 100644 +--- a/arch/arm/mach-mxs/clocksource-imx28.c ++++ b/arch/arm/mach-mxs/clocksource-imx28.c +@@ -39,6 +39,7 @@ static struct clocksource imx28_cs = { + .read = imx28_clocksource_read, + .mask = CLOCKSOURCE_MASK(32), + .shift = 17, ++ .priority = 80, + }; + + static int imx28_clocksource_init(void) +diff --git a/arch/arm/mach-pxa/clocksource.c b/arch/arm/mach-pxa/clocksource.c +index ebfe6f1c330f..3bc95827d88d 100644 +--- a/arch/arm/mach-pxa/clocksource.c ++++ b/arch/arm/mach-pxa/clocksource.c +@@ -28,6 +28,7 @@ static struct clocksource cs = { + .read = pxa_clocksource_read, + .mask = 0xffffffff, + .shift = 20, ++ .priority = 80, + }; + + static int clocksource_init(void) +diff --git a/arch/arm/mach-samsung/s3c-timer.c b/arch/arm/mach-samsung/s3c-timer.c +index 6f38df395851..38bcebc7c4cb 100644 +--- a/arch/arm/mach-samsung/s3c-timer.c ++++ b/arch/arm/mach-samsung/s3c-timer.c +@@ -101,6 +101,7 @@ static struct clocksource cs = { + .read = s3c_clocksource_read, + .mask = CLOCKSOURCE_MASK(TIMER_WIDTH), + .shift = TIMER_SHIFT, ++ .priority = 80, + }; + + static int s3c_clk_src_init(void) +diff --git a/arch/arm/mach-tegra/tegra20-timer.c b/arch/arm/mach-tegra/tegra20-timer.c +index 34d34f772331..8ca8cb24fad5 100644 +--- a/arch/arm/mach-tegra/tegra20-timer.c ++++ b/arch/arm/mach-tegra/tegra20-timer.c +@@ -41,6 +41,7 @@ static uint64_t tegra20_timer_cs_read(void) + static struct clocksource cs = { + .read = tegra20_timer_cs_read, + .mask = CLOCKSOURCE_MASK(32), ++ .priority = 80, + }; + + static int tegra20_timer_probe(struct device_d *dev) +diff --git a/arch/arm/mach-versatile/core.c b/arch/arm/mach-versatile/core.c +index eb94a07dc907..9a2a9cad80cc 100644 +--- a/arch/arm/mach-versatile/core.c ++++ b/arch/arm/mach-versatile/core.c +@@ -92,6 +92,7 @@ static struct clocksource vpb_cs = { + .read = vpb_clocksource_read, + .mask = CLOCKSOURCE_MASK(32), + .shift = 10, ++ .priority = 80, + }; + + /* From Linux v2.6.35 +diff --git a/arch/mips/lib/csrc-r4k.c b/arch/mips/lib/csrc-r4k.c +index 9facf04bd3e9..35fba3a29ca6 100644 +--- a/arch/mips/lib/csrc-r4k.c ++++ b/arch/mips/lib/csrc-r4k.c +@@ -23,6 +23,7 @@ static uint64_t c0_hpt_read(void) + static struct clocksource cs = { + .read = c0_hpt_read, + .mask = CLOCKSOURCE_MASK(32), ++ .priority = 70, + }; + + static int clocksource_init(void) +diff --git a/arch/mips/mach-xburst/csrc-jz4750.c b/arch/mips/mach-xburst/csrc-jz4750.c +index 302709e59747..43135ac4987e 100644 +--- a/arch/mips/mach-xburst/csrc-jz4750.c ++++ b/arch/mips/mach-xburst/csrc-jz4750.c +@@ -23,6 +23,7 @@ static uint64_t jz4750_cs_read(void) + static struct clocksource jz4750_cs = { + .read = jz4750_cs_read, + .mask = CLOCKSOURCE_MASK(32), ++ .priority = 80, + }; + + static int clocksource_init(void) +diff --git a/arch/openrisc/lib/clock.c b/arch/openrisc/lib/clock.c +index 5ff978e8411a..651b163f13cb 100644 +--- a/arch/openrisc/lib/clock.c ++++ b/arch/openrisc/lib/clock.c +@@ -28,6 +28,7 @@ static struct clocksource cs = { + .read = openrisc_clocksource_read, + .mask = 0xffffffff, + .shift = 12, ++ .priority = 80, + }; + + static int clocksource_init(void) +diff --git a/arch/powerpc/mach-mpc5xxx/time.c b/arch/powerpc/mach-mpc5xxx/time.c +index 8981b14eeb7d..d690d50f0d5a 100644 +--- a/arch/powerpc/mach-mpc5xxx/time.c ++++ b/arch/powerpc/mach-mpc5xxx/time.c +@@ -29,6 +29,7 @@ static struct clocksource cs = { + .read = ppc_clocksource_read, + .mask = CLOCKSOURCE_MASK(32), + .shift = 15, ++ .priority = 80, + }; + + static int clocksource_init(void) +diff --git a/arch/powerpc/mach-mpc85xx/time.c b/arch/powerpc/mach-mpc85xx/time.c +index 067bce8ea64e..5981995ac2ae 100644 +--- a/arch/powerpc/mach-mpc85xx/time.c ++++ b/arch/powerpc/mach-mpc85xx/time.c +@@ -28,6 +28,7 @@ static uint64_t ppc_clocksource_read(void) + static struct clocksource cs = { + .read = ppc_clocksource_read, + .mask = CLOCKSOURCE_MASK(64), ++ .priority = 80, + }; + + static int clocksource_init(void) +diff --git a/arch/sandbox/board/clock.c b/arch/sandbox/board/clock.c +index b005e71633ff..1787fb578626 100644 +--- a/arch/sandbox/board/clock.c ++++ b/arch/sandbox/board/clock.c +@@ -28,6 +28,7 @@ static struct clocksource cs = { + .read = linux_clocksource_read, + .mask = CLOCKSOURCE_MASK(32), + .shift = 10, ++ .priority = 80, + }; + + static int clocksource_init (void) +diff --git a/drivers/clocksource/amba-sp804.c b/drivers/clocksource/amba-sp804.c +index a22e567301b2..fcb2b0254bc3 100644 +--- a/drivers/clocksource/amba-sp804.c ++++ b/drivers/clocksource/amba-sp804.c +@@ -26,6 +26,7 @@ static struct clocksource sp804_clksrc = { + .read = sp804_read, + .shift = 20, + .mask = CLOCKSOURCE_MASK(32), ++ .priority = 60, + }; + + static int sp804_probe(struct amba_device *dev, const struct amba_id *id) +diff --git a/drivers/clocksource/arm_architected_timer.c b/drivers/clocksource/arm_architected_timer.c +index 16e40a1a0b3b..d5948fe9482c 100644 +--- a/drivers/clocksource/arm_architected_timer.c ++++ b/drivers/clocksource/arm_architected_timer.c +@@ -19,6 +19,7 @@ static struct clocksource cs = { + .read = arm_arch_clocksource_read, + .mask = CLOCKSOURCE_MASK(64), + .shift = 0, ++ .priority = 70, + }; + + static int arm_arch_timer_probe(struct device_d *dev) +diff --git a/drivers/clocksource/arm_global_timer.c b/drivers/clocksource/arm_global_timer.c +index f18c6e4152f9..65bfca355855 100644 +--- a/drivers/clocksource/arm_global_timer.c ++++ b/drivers/clocksource/arm_global_timer.c +@@ -60,6 +60,7 @@ static struct clocksource cs = { + .read = arm_global_clocksource_read, + .mask = CLOCKSOURCE_MASK(64), + .shift = 0, ++ .priority = 70, + }; + + static int arm_global_timer_probe(struct device_d *dev) +diff --git a/drivers/clocksource/arm_smp_twd.c b/drivers/clocksource/arm_smp_twd.c +index bc0c4a00b2f9..1ad754bb2b7a 100644 +--- a/drivers/clocksource/arm_smp_twd.c ++++ b/drivers/clocksource/arm_smp_twd.c +@@ -35,6 +35,7 @@ static struct clocksource smp_twd_clksrc = { + .read = smp_twd_read, + .shift = 20, + .mask = CLOCKSOURCE_MASK(32), ++ .priority = 60, + }; + + #define SMP_TWD_MAX_FREQ (25 *1000 * 1000) +diff --git a/drivers/clocksource/armv7m_systick.c b/drivers/clocksource/armv7m_systick.c +index 5f9222c50b8a..16d89c23bde5 100644 +--- a/drivers/clocksource/armv7m_systick.c ++++ b/drivers/clocksource/armv7m_systick.c +@@ -34,6 +34,7 @@ static struct clocksource cs = { + .read = armv7m_systick_clocksource_read, + .mask = CLOCKSOURCE_MASK(24), + .shift = 0, ++ .priority = 70, + }; + + static int armv7m_systick_probe(struct device_d *dev) +diff --git a/drivers/clocksource/bcm2835.c b/drivers/clocksource/bcm2835.c +index 5134b349157c..d84341fc4083 100644 +--- a/drivers/clocksource/bcm2835.c ++++ b/drivers/clocksource/bcm2835.c +@@ -28,6 +28,7 @@ static uint64_t stc_read_cycles(void) + static struct clocksource bcm2835_stc = { + .read = stc_read_cycles, + .mask = CLOCKSOURCE_MASK(32), ++ .priority = 80, + }; + + static int bcm2835_cs_probe(struct device_d *dev) +diff --git a/drivers/clocksource/clps711x.c b/drivers/clocksource/clps711x.c +index cd099604786e..1fe7f6c89114 100644 +--- a/drivers/clocksource/clps711x.c ++++ b/drivers/clocksource/clps711x.c +@@ -19,6 +19,7 @@ static uint64_t clps711x_cs_read(void) + static struct clocksource clps711x_cs = { + .read = clps711x_cs_read, + .mask = CLOCKSOURCE_MASK(16), ++ .priority = 60, + }; + + static int clps711x_cs_probe(struct device_d *dev) +diff --git a/drivers/clocksource/digic.c b/drivers/clocksource/digic.c +index 1a335582b733..234985aece44 100644 +--- a/drivers/clocksource/digic.c ++++ b/drivers/clocksource/digic.c +@@ -26,6 +26,7 @@ static uint64_t digic_cs_read(void) + static struct clocksource digic_cs = { + .read = digic_cs_read, + .mask = CLOCKSOURCE_MASK(16), ++ .priority = 60, + }; + + static int digic_timer_probe(struct device_d *dev) +diff --git a/drivers/clocksource/dw_apb_timer.c b/drivers/clocksource/dw_apb_timer.c +index aef4f16d1494..251089cf7e16 100644 +--- a/drivers/clocksource/dw_apb_timer.c ++++ b/drivers/clocksource/dw_apb_timer.c +@@ -94,6 +94,7 @@ static struct clocksource dw_apb_clksrc = { + .read = dw_apb_clocksource_read, + .mask = CLOCKSOURCE_MASK(32), + .shift = 0, ++ .priority = 50, + }; + + static int dw_apb_timer_probe(struct device_d *dev) +diff --git a/drivers/clocksource/efi.c b/drivers/clocksource/efi.c +index 5c8c5fd46b1e..9df5226573bc 100644 +--- a/drivers/clocksource/efi.c ++++ b/drivers/clocksource/efi.c +@@ -93,6 +93,7 @@ static struct clocksource efi_cs = { + .mask = CLOCKSOURCE_MASK(64), + .shift = 0, + .init = efi_cs_init, ++ .priority = 80, + }; + + static int efi_cs_probe(struct device_d *dev) +diff --git a/drivers/clocksource/kvx_timer.c b/drivers/clocksource/kvx_timer.c +index 2a05d8deedce..259755eacdda 100644 +--- a/drivers/clocksource/kvx_timer.c ++++ b/drivers/clocksource/kvx_timer.c +@@ -21,6 +21,7 @@ static struct clocksource kvx_clksrc = { + .read = kvx_pm_read, + .mask = CLOCKSOURCE_MASK(64), + .shift = 0, ++ .priority = 70, + }; + + static int kvx_timer_probe(struct device_d *dev) +diff --git a/drivers/clocksource/mvebu.c b/drivers/clocksource/mvebu.c +index eb5246e4e79b..d3214955dc8f 100644 +--- a/drivers/clocksource/mvebu.c ++++ b/drivers/clocksource/mvebu.c +@@ -42,6 +42,7 @@ static struct clocksource cs = { + .read = mvebu_clocksource_read, + .mask = CLOCKSOURCE_MASK(32), + .shift = 10, ++ .priority = 70, + }; + + static int mvebu_timer_probe(struct device_d *dev) +diff --git a/drivers/clocksource/nomadik.c b/drivers/clocksource/nomadik.c +index d71d9da6b8c0..7cf10352eac7 100644 +--- a/drivers/clocksource/nomadik.c ++++ b/drivers/clocksource/nomadik.c +@@ -71,6 +71,7 @@ static struct clocksource nmdk_clksrc = { + .read = nmdk_read_timer, + .shift = 20, + .mask = CLOCKSOURCE_MASK(32), ++ .priority = 60, + }; + + static void nmdk_timer_reset(void) +diff --git a/drivers/clocksource/orion.c b/drivers/clocksource/orion.c +index d40b09e5debc..4a5684980064 100644 +--- a/drivers/clocksource/orion.c ++++ b/drivers/clocksource/orion.c +@@ -31,6 +31,7 @@ static struct clocksource clksrc = { + .read = orion_clocksource_read, + .mask = CLOCKSOURCE_MASK(32), + .shift = 10, ++ .priority = 70, + }; + + static int orion_timer_probe(struct device_d *dev) +diff --git a/drivers/clocksource/rk_timer.c b/drivers/clocksource/rk_timer.c +index 5cc8d32b601b..e94103077103 100644 +--- a/drivers/clocksource/rk_timer.c ++++ b/drivers/clocksource/rk_timer.c +@@ -32,6 +32,7 @@ static struct clocksource rkcs = { + .read = rockchip_get_ticks, + .mask = CLOCKSOURCE_MASK(32), + .shift = 10, ++ .priority = 80, + }; + + static int rockchip_timer_probe(struct device_d *dev) +diff --git a/drivers/clocksource/timer-atmel-pit.c b/drivers/clocksource/timer-atmel-pit.c +index bbbc81788ce4..a133e384d74c 100644 +--- a/drivers/clocksource/timer-atmel-pit.c ++++ b/drivers/clocksource/timer-atmel-pit.c +@@ -36,6 +36,7 @@ static struct clocksource cs = { + .read = at91sam9_clocksource_read, + .mask = CLOCKSOURCE_MASK(32), + .shift = 10, ++ .priority = 70, + }; + + static void at91_pit_stop(void) +diff --git a/drivers/clocksource/timer-imx-gpt.c b/drivers/clocksource/timer-imx-gpt.c +index 28f90d967d3f..7ca879f4f008 100644 +--- a/drivers/clocksource/timer-imx-gpt.c ++++ b/drivers/clocksource/timer-imx-gpt.c +@@ -64,6 +64,7 @@ static struct clocksource cs = { + .read = imx_clocksource_read, + .mask = CLOCKSOURCE_MASK(32), + .shift = 10, ++ .priority = 70, + }; + + static int imx_clocksource_clock_change(struct notifier_block *nb, unsigned long event, void *data) +diff --git a/drivers/clocksource/timer-ti-32k.c b/drivers/clocksource/timer-ti-32k.c +index 1f3f15561e09..21cb68636954 100644 +--- a/drivers/clocksource/timer-ti-32k.c ++++ b/drivers/clocksource/timer-ti-32k.c +@@ -47,6 +47,7 @@ static struct clocksource s32k_cs = { + .read = s32k_clocksource_read, + .mask = CLOCKSOURCE_MASK(32), + .shift = 10, ++ .priority = 70, + }; + + /** +diff --git a/drivers/clocksource/timer-ti-dm.c b/drivers/clocksource/timer-ti-dm.c +index d43609ad1967..cdd297f10c91 100644 +--- a/drivers/clocksource/timer-ti-dm.c ++++ b/drivers/clocksource/timer-ti-dm.c +@@ -62,6 +62,7 @@ static struct clocksource dmtimer_cs = { + .read = dmtimer_read, + .mask = CLOCKSOURCE_MASK(32), + .shift = 10, ++ .priority = 70, + }; + + static int omap_dmtimer_probe(struct device_d *dev) +diff --git a/drivers/clocksource/uemd.c b/drivers/clocksource/uemd.c +index 342260c5644b..a763eadc0c86 100644 +--- a/drivers/clocksource/uemd.c ++++ b/drivers/clocksource/uemd.c +@@ -52,6 +52,7 @@ static uint64_t uemd_timer_cs_read(void) + static struct clocksource uemd_cs = { + .read = uemd_timer_cs_read, + .mask = CLOCKSOURCE_MASK(32), ++ .priority = 60, + }; + + static int uemd_timer_probe(struct device_d *dev) +-- +2.30.2 + |