Hi,
I am trying to understand the Linux Power management Unit framework. I have an ARM Cortex-A9x4 board. When I enable pm_test or pass initcall_debug parameter through U-boot via bootargs the system goes into (wfi/suspend state) and resumes properly. However, the issue is when I am not using pm_test and initcall_debug and put my system into WFI/SUSPEND state , it does not resume even if the registered wakeup IRQ is generated.
Following are my Queries/observations.
1. Reading the log I find that Linux Masks the non-wakeup interrupts. This code was not present in linux 3.4.14.
2. I tried to disable IRQCHIP_MASK_ON_SUSPEND flag from irq_chip. Doing so the I was able to resume from wfi state only once.
After that the system resumed immediately without any interrupt after putting it into wfi state.
3. I tried adding IRQF_NO_SUSPEND flag to the wakeup interrupt and also used enable_irq_wake() function but with no success.
The system does not respond to any interrupts once in wfi/suspend state.
4. I have attached log messages file for reference.
I am using linux kernel source revision 4.4.16. Can somebody please help me regarding this issue?
Regards,
Amit.
# echo suspend > /sys/power/state [ 299.672333] @@@@@@@@ In state_store function @@@@@@@@@ [ 299.677538] @@@@@@@@ Decoded state = 4 calling pm_suspend @@@@@@@ [ 299.683633] @@@@@@@@ In pm_suspend function @@@@@@@ [ 299.688543] PM: Syncing filesystems ... done. [ 299.693016] PM: Preparing system for sleep (suspend) [ 299.699451] Freezing user space processes ... (elapsed 0.001 seconds) done. [ 299.707676] Freezing remaining freezable tasks ... (elapsed 0.001 seconds) done. [ 299.716284] PM: Suspending system (suspend) [ 299.720501] In suspend_devices_and_enter function [ 299.725884] cpufreq: cpufreq_suspend: Suspending Governors [ 299.731395] cpufreq: !!!!!!!!! __cpufreq_governor: for CPU 0, event 2 !!!!!!!!!! [ 299.742445] PM: suspend of devices complete after 16.554 msecs [ 299.748327] In dpm_suspend_start function OK... [ 299.752861] PM: suspend devices took 0.030 seconds [ 299.757672] In suspend_enter function [ 299.761334] ##### 1. PMU wakeup mask = 0x0 ########### 2. PMU wakeup mask = 0x40000000 ###### [ 299.769713] Prepare function OK... [ 299.775443] PM: late suspend of devices complete after 2.144 msecs [ 299.781733] Disabling IRQ =33 [ 299.784697] Masking this INT [ 299.787398] **** 2. Leaving suspend_device_irq function***** [ 299.793253] In suspend_device_irqs sync_irq = 33 [ 299.797889] Disabling IRQ =34 [ 299.800850] Masking this INT [ 299.803551] **** 2. Leaving suspend_device_irq function***** [ 299.809401] In suspend_device_irqs sync_irq = 34 [ 299.814027] Disabling IRQ =39 [ 299.816988] Masking this INT [ 299.819688] **** 2. Leaving suspend_device_irq function***** [ 299.825537] In suspend_device_irqs sync_irq = 39 [ 299.830181] Disabling IRQ =46 [ 299.833142] Masking this INT [ 299.835843] **** 2. Leaving suspend_device_irq function***** [ 299.841691] In suspend_device_irqs sync_irq = 46 [ 299.846321] Disabling IRQ =53 [ 299.849282] Masking this INT [ 299.851982] **** 2. Leaving suspend_device_irq function***** [ 299.857843] In suspend_device_irqs sync_irq = 53 [ 299.862462] Disabling IRQ =54 [ 299.865423] Masking this INT [ 299.868123] **** 2. Leaving suspend_device_irq function***** [ 299.873977] In suspend_device_irqs sync_irq = 54 [ 299.878612] Disabling IRQ =56 [ 299.881574] Masking this INT [ 299.884274] **** 2. Leaving suspend_device_irq function***** [ 299.890122] In suspend_device_irqs sync_irq = 56 [ 299.894765] Disabling IRQ =70 [ 299.897725] Masking this INT [ 299.900425] **** 2. Leaving suspend_device_irq function***** [ 299.906274] In suspend_device_irqs sync_irq = 70 [ 299.910906] Disabling IRQ =71 [ 299.913868] Masking this INT [ 299.916568] **** 2. Leaving suspend_device_irq function***** [ 299.922417] In suspend_device_irqs sync_irq = 71 [ 299.927033] Disabling IRQ =72 [ 299.929993] Masking this INT [ 299.932693] **** 2. Leaving suspend_device_irq function***** [ 299.938543] In suspend_device_irqs sync_irq = 72 [ 299.943160] Disabling IRQ =73 [ 299.946119] Masking this INT [ 299.948819] **** 2. Leaving suspend_device_irq function***** [ 299.954667] In suspend_device_irqs sync_irq = 73 [ 299.959300] Disabling IRQ =74 [ 299.962261] Masking this INT [ 299.964961] **** 2. Leaving suspend_device_irq function***** [ 299.970810] In suspend_device_irqs sync_irq = 74 [ 299.975427] Disabling IRQ =75 [ 299.978387] Masking this INT [ 299.981087] **** 2. Leaving suspend_device_irq function***** [ 299.986935] In suspend_device_irqs sync_irq = 75 [ 299.991567] Disabling IRQ =76 [ 299.994527] Masking this INT [ 299.997228] **** 2. Leaving suspend_device_irq function***** [ 300.003077] In suspend_device_irqs sync_irq = 76 [ 300.007729] Disabling IRQ =77 [ 300.010691] Masking this INT [ 300.013392] **** 2. Leaving suspend_device_irq function***** [ 300.019245] In suspend_device_irqs sync_irq = 77 [ 300.023878] Disabling IRQ =86 [ 300.026839] Masking this INT [ 300.029539] **** 2. Leaving suspend_device_irq function***** [ 300.035389] In suspend_device_irqs sync_irq = 86 [ 300.040023] Disabling IRQ =88 [ 300.042985] Masking this INT [ 300.045685] **** 2. Leaving suspend_device_irq function***** [ 300.051534] In suspend_device_irqs sync_irq = 88 [ 300.056161] Disabling IRQ =94 [ 300.059122] Masking this INT [ 300.061822] **** 2. Leaving suspend_device_irq function***** [ 300.067680] In suspend_device_irqs sync_irq = 94 [ 300.074353] PM: noirq suspend of devices complete after 292.691 msecs [ 300.080832] Disabling non-boot CPUs ... [ 300.084724] cpufreq: cpufreq_offline_prepare: unregistering CPU 1 [ 300.127229] IRQ70 no longer affine to CPU1 [ 300.131327] IRQ72 no longer affine to CPU1 [ 300.135420] IRQ74 no longer affine to CPU1 [ 300.139512] IRQ76 no longer affine to CPU1 [ 300.143855] CPU1: shutdown [ 300.147740] cpufreq: cpufreq_offline_prepare: unregistering CPU 2 [ 300.177306] IRQ71 no longer affine to CPU2 [ 300.181404] IRQ73 no longer affine to CPU2 [ 300.185496] IRQ75 no longer affine to CPU2 [ 300.189588] IRQ77 no longer affine to CPU2 [ 300.193918] CPU2: shutdown [ 300.198046] After Disabled non boot CPUS [ 300.201974] Checking pending wakeup interrupts [ 300.206415] ^^^^ In opv5xc_pm_suspend function current_suspend_state = 4 calling opv5xc_pm_suspend_doze^^^^^^ [ 300.206415] syscore_suspend OK.... *wakeup = 0 [ 300.206415] Calling OPV5XC enter function [ 300.206415] opv5xc_pm_enter: Entering suspend state 4 [ 300.206415] In opv5xc_pm_cpu_prepare function current state = 4 calling opv5xc_pm_cpu_prepare_doze [ 300.206415] !!!!! In opv5xc_pm_cpu_prepare_doze function !!!! [ 300.206415] System entering in DOZE mode [ 300.206415] @@@@@@@@ In opv5xc_pm_cpu_suspend function calling cpu_do_idle @@@@@@