On Mon, Jun 21, 2021 at 08:10:12PM +0200, AngeloGioacchino Del Regno wrote: > In commit a871be6b8eee ("cpuidle: Convert Qualcomm SPM driver to a generic > CPUidle driver") the SPM driver has been converted to a > generic CPUidle driver: that was mainly made to simplify the > driver and that was a great accomplishment; > Though, it was ignored that the SPM driver is not used only > on the ARM architecture. > I don't really understand why you insist on writing that I deliberately "ignored" your use case when converting the driver. This is not true. Perhaps that's not actually what you meant but that's how it sounds to me. > In preparation for the enablement of SPM features on AArch64/ARM64, > split the cpuidle-qcom-spm driver in two: the CPUIdle related > state machine (currently used only on ARM SoCs) stays there, while > the SPM communication handling lands back in soc/qcom/spm.c and > also making sure to not discard the simplifications that were > introduced in the aforementioned commit. > > Since now the "two drivers" are split, the SCM dependency in the > main SPM handling is gone and for this reason it was also possible > to move the SPM initialization early: this will also make sure that > whenever the SAW CPUIdle driver is getting initialized, the SPM > driver will be ready to do the job. > > Please note that the anticipation of the SPM initialization was > also done to optimize the boot times on platforms that have their > CPU/L2 idle states managed by other means (such as PSCI), while > needing SAW initialization for other purposes, like AVS control. > > Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@xxxxxxxxxxxxxx> > --- > drivers/cpuidle/Kconfig.arm | 1 + > drivers/cpuidle/cpuidle-qcom-spm.c | 324 +++++++---------------------- > drivers/soc/qcom/Kconfig | 9 + > drivers/soc/qcom/Makefile | 1 + > drivers/soc/qcom/spm.c | 198 ++++++++++++++++++ > include/soc/qcom/spm.h | 41 ++++ > 6 files changed, 325 insertions(+), 249 deletions(-) > create mode 100644 drivers/soc/qcom/spm.c > create mode 100644 include/soc/qcom/spm.h > > diff --git a/drivers/cpuidle/cpuidle-qcom-spm.c b/drivers/cpuidle/cpuidle-qcom-spm.c > index adf91a6e4d7d..091453135ea6 100644 > --- a/drivers/cpuidle/cpuidle-qcom-spm.c > +++ b/drivers/cpuidle/cpuidle-qcom-spm.c > [...] > +static int spm_cpuidle_register(int cpu) > { > + struct platform_device *pdev = NULL; > + struct device_node *cpu_node, *saw_node; > + struct cpuidle_qcom_spm_data data = { > + .cpuidle_driver = { > + .name = "qcom_spm", > + .owner = THIS_MODULE, > + .cpumask = (struct cpumask *)cpumask_of(cpu), > + .states[0] = { > + .enter = spm_enter_idle_state, > + .exit_latency = 1, > + .target_residency = 1, > + .power_usage = UINT_MAX, > + .name = "WFI", > + .desc = "ARM WFI", > + } > + } > + }; The stack is gone after the function returns. Stephan [ 0.756176] 8<--- cut here --- [ 0.756222] ledtrig-cpu: registered to indicate activity on CPUs [ 0.756566] 8<--- cut here --- [ 0.756567] 8<--- cut here --- [ 0.756570] Unable to handle kernel NULL pointer dereference at virtual address 00000000 [ 0.756571] Unable to handle kernel NULL pointer dereference at virtual address 00000000 [ 0.756577] pgd = (ptrval) [ 0.756578] pgd = (ptrval) [ 0.756583] [00000000] *pgd=00000000 [ 0.756583] [00000000] *pgd=00000000 [ 0.756588] [ 0.756597] Internal error: Oops: 80000005 [#1] PREEMPT SMP ARM [ 0.756605] Modules linked in: [ 0.756613] CPU: 3 PID: 0 Comm: swapper/3 Not tainted 5.13.0-rc7 #9 [ 0.756622] Hardware name: Generic DT based system [ 0.756626] PC is at 0x0 [ 0.756634] LR is at cpuidle_enter_state+0x12c/0x358 [ 0.756650] pc : [<00000000>] lr : [<c0609c6c>] psr: 60000093 [ 0.756656] sp : c1085f68 ip : 017dc905 fp : 00000000 [ 0.756662] r10: 00000000 r9 : c1059b28 r8 : ef000a30 [ 0.756668] r7 : c1059938 r6 : 2d183b16 r5 : c1059b18 r4 : 00000005 [ 0.756675] r3 : 00000000 r2 : 00000005 r1 : c1059938 r0 : ef000a30 [ 0.756682] Flags: nZCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment none [ 0.756691] Control: 10c5383d Table: 8000406a DAC: 00000051 [ 0.756696] Register r0 information: non-slab/vmalloc memory [ 0.756705] Register r1 information: non-slab/vmalloc memory [ 0.756713] Register r2 information: non-paged memory [ 0.756719] Register r3 information: NULL pointer [ 0.756726] Register r4 information: non-paged memory [ 0.756732] Register r5 information: non-slab/vmalloc memory [ 0.756739] Register r6 information: non-paged memory [ 0.756746] Register r7 information: non-slab/vmalloc memory [ 0.756753] Register r8 information: non-slab/vmalloc memory [ 0.756760] Register r9 information: non-slab/vmalloc memory [ 0.756767] Register r10 information: NULL pointer [ 0.756773] Register r11 information: NULL pointer [ 0.756780] Register r12 information: non-paged memory [ 0.756787] Process swapper/3 (pid: 0, stack limit = 0x(ptrval)) [ 0.756794] Stack: (0xc1085f68 to 0xc1086000) [ 0.756804] 5f60: 00000000 c1084000 c1085fc3 ef000a30 c1059938 00000005 [ 0.756815] 5f80: c0c06090 2719c400 00000000 c1084000 c1059938 c0609edc 00000003 c1084000 [ 0.756826] 5fa0: c0c0604c ef000a30 c0b4ea28 c015d0f8 c1085fb0 00000005 00000093 c0cb2cc2 [ 0.756837] 5fc0: 00000051 b02e84c1 c1085ff8 00000093 00000051 10c0387d c1085ff8 8000406a [ 0.756848] 5fe0: 410fd030 00000000 00000000 c015d51c 8107806a 801015d0 00000000 00000000 [ 0.756861] [<c0609c6c>] (cpuidle_enter_state) from [<c0609edc>] (cpuidle_enter+0x30/0x40) [ 0.756883] [<c0609edc>] (cpuidle_enter) from [<c015d0f8>] (do_idle+0x210/0x2e8) [ 0.756904] [<c015d0f8>] (do_idle) from [<c015d51c>] (cpu_startup_entry+0x18/0x1c) [ 0.756920] [<c015d51c>] (cpu_startup_entry) from [<801015d0>] (0x801015d0) [ 0.756937] Code: bad PC value [ 0.756950] Internal error: Oops: 80000005 [#2] PREEMPT SMP ARM [ 0.756952] ---[ end trace 9857663ab4add8af ]--- [ 0.756957] Modules linked in: [ 0.756958] Kernel panic - not syncing: Attempted to kill the idle task! [ 0.756960] [ 0.756963] CPU: 1 PID: 0 Comm: swapper/1 Tainted: G D 5.13.0-rc7 #9 [ 0.756972] Hardware name: Generic DT based system [ 0.756976] PC is at 0x0 [ 0.756982] LR is at cpuidle_enter_state+0x12c/0x358 [ 0.756993] pc : [<00000000>] lr : [<c0609c6c>] psr: 60000093 [ 0.756999] sp : c1081f68 ip : 017dc905 fp : 00000000 [ 0.757005] r10: 00000000 r9 : c1059b28 r8 : eefe0a30 [ 0.757011] r7 : c1059938 r6 : 2d1844da r5 : c1059b18 r4 : 00000005 [ 0.757018] r3 : 00000000 r2 : 00000005 r1 : c1059938 r0 : eefe0a30 [ 0.757025] Flags: nZCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment none [ 0.757033] Control: 10c5383d Table: 8000406a DAC: 00000051 [ 0.757038] Register r0 information: non-slab/vmalloc memory [ 0.757047] Register r1 information: non-slab/vmalloc memory [ 0.757054] Register r2 information: non-paged memory [ 0.757061] Register r3 information: NULL pointer [ 0.757067] Register r4 information: non-paged memory [ 0.757074] Register r5 information: non-slab/vmalloc memory [ 0.757080] Register r6 information: non-paged memory [ 0.757087] Register r7 information: non-slab/vmalloc memory [ 0.757094] Register r8 information: non-slab/vmalloc memory [ 0.757101] Register r9 information: non-slab/vmalloc memory [ 0.757108] Register r10 information: NULL pointer [ 0.757114] Register r11 information: NULL pointer [ 0.757121] Register r12 information: non-paged memory [ 0.757128] Process swapper/1 (pid: 0, stack limit = 0x(ptrval)) [ 0.757134] Stack: (0xc1081f68 to 0xc1082000) [ 0.757144] 1f60: 00000000 c1080000 c1081fc3 eefe0a30 c1059938 00000005 [ 0.757155] 1f80: c0c06090 2719c400 00000000 c1080000 c1059938 c0609edc 00000001 c1080000 [ 0.757167] 1fa0: c0c0604c eefe0a30 c0b4ea28 c015d0f8 c1081fb0 00000005 00000093 c0cb2cc2 [ 0.757178] 1fc0: 00000051 cf41e4d1 c1081ff8 00000093 00000051 10c0387d c1081ff8 8000406a [ 0.757189] 1fe0: 410fd030 00000000 00000000 c015d51c 8107806a 801015d0 00000000 00000000 [ 0.757197] [<c0609c6c>] (cpuidle_enter_state) from [<c0609edc>] (cpuidle_enter+0x30/0x40) [ 0.757218] [<c0609edc>] (cpuidle_enter) from [<c015d0f8>] (do_idle+0x210/0x2e8) [ 0.757236] [<c015d0f8>] (do_idle) from [<c015d51c>] (cpu_startup_entry+0x18/0x1c) [ 0.757251] [<c015d51c>] (cpu_startup_entry) from [<801015d0>] (0x801015d0) [ 0.757267] Code: bad PC value [ 0.757271] ---[ end trace 9857663ab4add8b0 ]--- [ 0.761255] Unable to handle kernel NULL pointer dereference at virtual address 00000000 [ 0.761256] CPU2: stopping [ 0.761261] pgd = (ptrval) [ 0.761261] CPU: 2 PID: 1 Comm: swapper/0 Tainted: G D 5.13.0-rc7 #9 [ 0.761265] [00000000] *pgd=00000000 [ 0.761271] Hardware name: Generic DT based system [ 0.761275] Internal error: Oops: 80000005 [#3] PREEMPT SMP ARM [ 0.761281] Modules linked in: [ 0.761278] [<c010ee70>] (unwind_backtrace) from [<c010ac80>] (show_stack+0x10/0x14) [ 0.761287] CPU: 0 PID: 0 Comm: swapper/0 Tainted: G D 5.13.0-rc7 #9 [ 0.761296] Hardware name: Generic DT based system [ 0.761300] PC is at 0x0 [ 0.761299] [<c010ac80>] (show_stack) from [<c07bcbb0>] (dump_stack+0x94/0xa8) [ 0.761306] LR is at cpuidle_enter_state+0x12c/0x358 [ 0.761317] pc : [<00000000>] lr : [<c0609c6c>] psr: 60000093 [ 0.761323] sp : c0c01f28 ip : 017dc905 fp : 00000000 [ 0.761318] [<c07bcbb0>] (dump_stack) from [<c010ccbc>] (do_handle_IPI+0xf4/0x11c) [ 0.761329] r10: 00000000 r9 : c1059b28 r8 : eefd0a30 [ 0.761335] r7 : c1059938 r6 : 2d12399c r5 : c1059b18 r4 : 00000005 [ 0.761335] [<c010ccbc>] (do_handle_IPI) from [<c010ccfc>] (ipi_handler+0x18/0x20) [ 0.761341] r3 : 00000000 r2 : 00000005 r1 : c1059938 r0 : eefd0a30 [ 0.761348] Flags: nZCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment none [ 0.761356] Control: 10c5383d Table: 8000406a DAC: 00000051 [ 0.761350] [<c010ccfc>] (ipi_handler) from [<c018c898>] (handle_percpu_devid_irq+0x78/0x150) [ 0.761360] Register r0 information: non-slab/vmalloc memory [ 0.761369] Register r1 information: non-slab/vmalloc memory [ 0.761376] Register r2 information: [ 0.761368] [<c018c898>] (handle_percpu_devid_irq) from [<c01865d8>] (__handle_domain_irq+0x7c/0xd0) [ 0.761379] non-paged memory [ 0.761382] Register r3 information: NULL pointer [ 0.761389] Register r4 information: non-paged memory [ 0.761395] Register r5 information: [ 0.761389] [<c01865d8>] (__handle_domain_irq) from [<c04879f4>] (gic_handle_irq+0x70/0x84) [ 0.761398] non-slab/vmalloc memory [ 0.761402] Register r6 information: non-paged memory [ 0.761408] Register r7 information: non-slab/vmalloc memory [ 0.761415] Register r8 information: [ 0.761411] [<c04879f4>] (gic_handle_irq) from [<c0100b4c>] (__irq_svc+0x6c/0xa8) [ 0.761419] non-slab/vmalloc memory [ 0.761422] Register r9 information: non-slab/vmalloc memory [ 0.761427] Exception stack(0xc1059e28 to 0xc1059e70) [ 0.761429] Register r10 information: NULL pointer [ 0.761435] Register r11 information: [ 0.761437] 9e20: 60000093 2e4a2000 00000000 c0b48458 c0c060a8 00000034 [ 0.761440] NULL pointer [ 0.761443] Register r12 information: non-paged memory [ 0.761448] 9e40: c0cc8628 c1058000 60000013 00000000 c09fb5bc c0a614d4 00000143 c1059e78 [ 0.761449] Process swapper/0 (pid: 0, stack limit = 0x(ptrval)) [ 0.761456] 9e60: c0183ccc c0183cd0 60000013 ffffffff [ 0.761456] Stack: (0xc0c01f28 to 0xc0c02000) [ 0.761466] 1f20: 00000000 c0c00000 c0c01f83 eefd0a30 c1059938 00000005 [ 0.761462] [<c0100b4c>] (__irq_svc) from [<c0183cd0>] (vprintk_emit+0x17c/0x1d4) [ 0.761477] 1f40: c0c06090 26dcbb00 00000000 c0c00000 c1059938 c0609edc 00000000 c0c00000 [ 0.761479] [<c0183cd0>] (vprintk_emit) from [<c0183d4c>] (vprintk_default+0x24/0x2c) [ 0.761488] 1f60: c0c0604c eefd0a30 c0b4ea28 c015d0f8 c0c01f70 00000005 ef00cbc0 c0cb2cc2 [ 0.761498] 1f80: 00c00000 11feb622 c0b39a54 000000e1 c0c00000 00000001 c0b39a54 00000000 [ 0.761497] [<c0183d4c>] (vprintk_default) from [<c07ba87c>] (printk+0x30/0x54) [ 0.761509] 1fa0: ef00cbc0 c0b39a54 00000000 c015d51c c0cc6040 c0b00e34 ffffffff ffffffff [ 0.761520] 1fc0: 00000000 c0b00590 00000000 c0b39a54 11fbbb22 00000000 c0b00330 00000051 [ 0.761514] [<c07ba87c>] (printk) from [<c0b264a0>] (ledtrig_cpu_init+0xf0/0xfc) [ 0.761530] 1fe0: 10c0387d 00000000 81e00000 410fd030 10c5387d 00000000 00000000 00000000 [ 0.761534] [<c0b264a0>] (ledtrig_cpu_init) from [<c01017a4>] (do_one_initcall+0x50/0x1c4) [ 0.761537] [<c0609c6c>] (cpuidle_enter_state) from [<c0609edc>] (cpuidle_enter+0x30/0x40) [ 0.761552] [<c01017a4>] (do_one_initcall) from [<c0b010e0>] (kernel_init_freeable+0x22c/0x290) [ 0.761558] [<c0609edc>] (cpuidle_enter) from [<c015d0f8>] (do_idle+0x210/0x2e8) [ 0.761569] [<c0b010e0>] (kernel_init_freeable) from [<c07c014c>] (kernel_init+0x8/0x118) [ 0.761575] [<c015d0f8>] (do_idle) from [<c015d51c>] (cpu_startup_entry+0x18/0x1c) [ 0.761588] [<c07c014c>] (kernel_init) from [<c0100150>] (ret_from_fork+0x14/0x24) [ 0.761591] [<c015d51c>] (cpu_startup_entry) from [<c0b00e34>] (start_kernel+0x4e4/0x510) [ 0.761605] Exception stack(0xc1059fb0 to 0xc1059ff8) [ 0.761606] [<c0b00e34>] (start_kernel) from [<00000000>] (0x0) [ 0.761613] 9fa0: 00000000 00000000 00000000 00000000 [ 0.761620] Code: bad PC value [ 0.761623] 9fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [ 0.761625] ---[ end trace 9857663ab4add8b1 ]--- [ 0.761632] 9fe0: 00000000 00000000 00000000 00000000 00000013 00000000 [ 1.740778] ---[ end Kernel panic - not syncing: Attempted to kill the idle task! ]---