大破雑記帳

個人用メモな雑記ブログ いろんなことをざっくりと。

kirkwoodはLinux Kernel 5.13までrestart_handlerを使えない

OpenWrtにおける "kirkwood" targetのデバイスにおいて、Linux Kernelは再起動 (reboot) を以下の通り実行する。 表題の件に関係しない呼び出しは省く。また以下でのリンクは5.10のものを使用する
  1. kernel/reboot.ckernel_restart を呼び出し(ここ
  2. arch/arm/kernel/reboot.cmachine_restart を呼び出し(ここ
  3. 上から呼ばれた machine_restart において、ARM特有の arm_pm_restart が登録されて(nullでない)いれば arm_pm_restart を呼び出し、未登録なら kernel/reboot.cdo_kernel_restart を呼び出し(ここ
ここで問題となるのが上記最後のステップにおける arm_pm_restart であり、これはブート時に arch/arm/kernel/setup.csetup_arch 内において、 mdesc->restart が登録されて(nullでない)いる場合それを arm_pm_restart に登録する(ここ)。
mdescarch/arm/ 内に存在する各プラットフォーム(mach-*)毎またはその中での系統毎に定義されるものをDeviceTreeと一致を取るなどして取り出したものであり(ここ)、OpenWrtにおける "kirkwood" target用のものは ここ で定義されている。
kirkwoodのデバイスではその中の .restart が登録されている為にそれが arm_pm_restart にも適用されてしまい、別途登録した restart_handler が使用できなくなってしまう。

なお、本来であればkirkwoodデバイスにおいてはこのrestartで足りるはずであるものの、I-O DATA HDL-AやHDL2-Aにおいてはreset周りをR8C/25マイコンが担当しており、それに対してコマンドを送らなければ正しく再起動を行えず、停止してしまう。

ちなみに、Linux Kernel 5.14以降では上記の arm_pm_restart が削除され、各プラットフォームまたは系統毎に定義されるrestartは restart_handler の一つとして登録するよう変更されている。この為、もし別途 restart_handler を使用したい場合、ARM側のハンドラよりも高い優先度(数字を大きくする)でハンドラを登録すれば、そちらが先に使用される。