From c1794b3cf632ac143fe14a3b44de4823c210726f Mon Sep 17 00:00:00 2001 From: Lucas Date: Tue, 7 Jul 2026 10:11:16 +0800 Subject: [PATCH 1/3] Update luci.airoha_npu Signed-off-by: Lucas --- .../root/usr/libexec/rpcd/luci.airoha_npu | 58 ++++++------------- 1 file changed, 19 insertions(+), 39 deletions(-) diff --git a/package/luci-app-airoha-npu/root/usr/libexec/rpcd/luci.airoha_npu b/package/luci-app-airoha-npu/root/usr/libexec/rpcd/luci.airoha_npu index 8af23ccd10e00c..cb74b08ef99c5d 100755 --- a/package/luci-app-airoha-npu/root/usr/libexec/rpcd/luci.airoha_npu +++ b/package/luci-app-airoha-npu/root/usr/libexec/rpcd/luci.airoha_npu @@ -2,50 +2,25 @@ # Airoha SoC Status RPC backend for LuCI (NPU + CPU + Overclock) +2026.7.7 + . /lib/functions.sh -# Timeout-protected hardware register read via devmem. -# Prevents rpcd/LuCI hang when a register bus stalls. -# Usage: _devmem_read
[timeout_sec] -# Returns register value (hex or decimal) on success, "0" on timeout/error. +# Check if NPU bus driver is loaded and ready for register access. +# Returns 0 (true) if ready, 1 (false) otherwise. +_npu_bus_ready() { + [ -d "/sys/bus/platform/drivers/airoha-npu" ] && \ + ls -1 "/sys/bus/platform/drivers/airoha-npu" 2>/dev/null | grep -q '\.npu$' +} + +# Hardware register read via devmem. +# Caller MUST guard with _npu_bus_ready before using. _devmem_read() { local addr="$1" - local to="${2:-2}" - local val="" tmp pid i - - # Preferred path: busybox/coreutils timeout - if command -v timeout >/dev/null 2>&1; then - val=$(timeout "$to" devmem "$addr" 2>/dev/null) || val="" - echo "${val:-0}" - return 0 - fi - - # Fallback: background process + manual kill-on-timeout - tmp="/tmp/_dm_${$}" - ( devmem "$addr" >"$tmp" 2>/dev/null ) & - pid=$! - i=0 - while [ "$i" -lt "$to" ]; do - kill -0 "$pid" 2>/dev/null || break - sleep 1 - i=$((i + 1)) - done + local val="" - if kill -0 "$pid" 2>/dev/null; then - kill -9 "$pid" 2>/dev/null - wait "$pid" 2>/dev/null - rm -f "$tmp" - echo "0" - return 0 - fi - - wait "$pid" 2>/dev/null - if [ -f "$tmp" ] && [ -s "$tmp" ]; then - read -r val <"$tmp" 2>/dev/null - fi - rm -f "$tmp" + val=$(devmem "$addr" 2>/dev/null) || val="" echo "${val:-0}" - return 0 } get_status() { @@ -130,7 +105,7 @@ get_status() { # Read actual PLL frequency from hardware (detects overclock) local pll_freq=0 - if command -v devmem > /dev/null 2>&1; then + if _npu_bus_ready && command -v devmem > /dev/null 2>&1; then local pcw_raw=$(_devmem_read 0x1fa202b4) local chg_raw=$(_devmem_read 0x1fa202b8) if [ -n "$pcw_raw" ] && [ -n "$chg_raw" ]; then @@ -433,6 +408,11 @@ get_frame_engine() { return fi + if ! _npu_bus_ready; then + echo '{"error":"NPU bus not ready"}' + return + fi + # PSE queue status (IQ=hi16, OQ=lo16) and drop counts for each port local i reg_q reg_d pse_ports="" for i in 0 1 2 3 4 5 6 7 8 9; do From a9e18a4cc3a2ec390a0c098bc0c5216bdba4fac4 Mon Sep 17 00:00:00 2001 From: Lucas Date: Tue, 7 Jul 2026 10:33:57 +0800 Subject: [PATCH 2/3] Update luci.airoha_npu Signed-off-by: Lucas --- .../luci-app-airoha-npu/root/usr/libexec/rpcd/luci.airoha_npu | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/luci-app-airoha-npu/root/usr/libexec/rpcd/luci.airoha_npu b/package/luci-app-airoha-npu/root/usr/libexec/rpcd/luci.airoha_npu index cb74b08ef99c5d..8d8faa628d2b02 100755 --- a/package/luci-app-airoha-npu/root/usr/libexec/rpcd/luci.airoha_npu +++ b/package/luci-app-airoha-npu/root/usr/libexec/rpcd/luci.airoha_npu @@ -2,7 +2,7 @@ # Airoha SoC Status RPC backend for LuCI (NPU + CPU + Overclock) -2026.7.7 +#2026.7.7 . /lib/functions.sh From 0716f00d7d0cf88839de3c488b377569e1de03cf Mon Sep 17 00:00:00 2001 From: Lucas Date: Tue, 7 Jul 2026 15:41:18 +0800 Subject: [PATCH 3/3] Update luci.airoha_npu Signed-off-by: Lucas --- .../root/usr/libexec/rpcd/luci.airoha_npu | 58 +++++++++++++------ 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/package/luci-app-airoha-npu/root/usr/libexec/rpcd/luci.airoha_npu b/package/luci-app-airoha-npu/root/usr/libexec/rpcd/luci.airoha_npu index 8d8faa628d2b02..8af23ccd10e00c 100755 --- a/package/luci-app-airoha-npu/root/usr/libexec/rpcd/luci.airoha_npu +++ b/package/luci-app-airoha-npu/root/usr/libexec/rpcd/luci.airoha_npu @@ -2,25 +2,50 @@ # Airoha SoC Status RPC backend for LuCI (NPU + CPU + Overclock) -#2026.7.7 - . /lib/functions.sh -# Check if NPU bus driver is loaded and ready for register access. -# Returns 0 (true) if ready, 1 (false) otherwise. -_npu_bus_ready() { - [ -d "/sys/bus/platform/drivers/airoha-npu" ] && \ - ls -1 "/sys/bus/platform/drivers/airoha-npu" 2>/dev/null | grep -q '\.npu$' -} - -# Hardware register read via devmem. -# Caller MUST guard with _npu_bus_ready before using. +# Timeout-protected hardware register read via devmem. +# Prevents rpcd/LuCI hang when a register bus stalls. +# Usage: _devmem_read
[timeout_sec] +# Returns register value (hex or decimal) on success, "0" on timeout/error. _devmem_read() { local addr="$1" - local val="" + local to="${2:-2}" + local val="" tmp pid i + + # Preferred path: busybox/coreutils timeout + if command -v timeout >/dev/null 2>&1; then + val=$(timeout "$to" devmem "$addr" 2>/dev/null) || val="" + echo "${val:-0}" + return 0 + fi + + # Fallback: background process + manual kill-on-timeout + tmp="/tmp/_dm_${$}" + ( devmem "$addr" >"$tmp" 2>/dev/null ) & + pid=$! + i=0 + while [ "$i" -lt "$to" ]; do + kill -0 "$pid" 2>/dev/null || break + sleep 1 + i=$((i + 1)) + done - val=$(devmem "$addr" 2>/dev/null) || val="" + if kill -0 "$pid" 2>/dev/null; then + kill -9 "$pid" 2>/dev/null + wait "$pid" 2>/dev/null + rm -f "$tmp" + echo "0" + return 0 + fi + + wait "$pid" 2>/dev/null + if [ -f "$tmp" ] && [ -s "$tmp" ]; then + read -r val <"$tmp" 2>/dev/null + fi + rm -f "$tmp" echo "${val:-0}" + return 0 } get_status() { @@ -105,7 +130,7 @@ get_status() { # Read actual PLL frequency from hardware (detects overclock) local pll_freq=0 - if _npu_bus_ready && command -v devmem > /dev/null 2>&1; then + if command -v devmem > /dev/null 2>&1; then local pcw_raw=$(_devmem_read 0x1fa202b4) local chg_raw=$(_devmem_read 0x1fa202b8) if [ -n "$pcw_raw" ] && [ -n "$chg_raw" ]; then @@ -408,11 +433,6 @@ get_frame_engine() { return fi - if ! _npu_bus_ready; then - echo '{"error":"NPU bus not ready"}' - return - fi - # PSE queue status (IQ=hi16, OQ=lo16) and drop counts for each port local i reg_q reg_d pse_ports="" for i in 0 1 2 3 4 5 6 7 8 9; do