uzbek-plus/r2/R2-REPORT.md
q 8d7721c775 B7: add network time bootstrap and persistent B7C cache
B7A: QMI DMS time vs VNIIFTRI NTP (DMS = UTC - 0.28 s, sigma 1 ms; NITZ = DMS
truncated to 1 s). B7B: a 1970 -> 2026 date -s step is harmless for the modem
stack. B7C: aurora-modem probes DMS/NITZ along the start flow and steps
CLOCK_REALTIME once at the first valid sample (REG registered/attached), never
RTC; background SNTP check (query only) after START OK. 3/3 class-A cold boots
PASS (residual +0.04/+0.36/+0.84 s), cache 14fe453a written (B7C_WRITE_VERIFIED)
and verified by a normal power-on (V1, +0.26 s).

Also publishes the prerequisite R2 (boot-hang / lk eMMC investigation, T4
telnet baseline that B7C builds on) and R3 (autonomous cold boot, NCM loss)
material, and extends tools/publish-sanitize.py to r2/, r3/, b7/.
Binary images, initramfs, busybox and raw logs stay out (see b7/*/SHA256SUMS).
2026-10-02 20:18:25 +03:00

11 KiB
Raw Blame History

R2: ранние зависания bootchain, диагностика (2026-10-01)

Режим: только чтение. Во flash ничего не писалось, перезагрузок не было. B6P не трогали. Живые чтения делались на текущей загрузке pc6 (uptime ~1000 с): PMIC через regmap debugfs 0-00, APSS WDT через devmem, только read.

Данные

  • 41 UART-лог (logs/uart/*.log на 480s, 29.09–30.09), 96 стартов SBL1. Разбор: table.py → table.txt, sbltime.py → sbl.txt.
  • По каждому старту: тайминги SBL1 (B/D-метки), batt_voltage, стадия, на которой остановился, строка перед стартом (что его вызвало).
  • PON: pc4/pc5/pc6 pon.txt, 22:30 (pc2→pc3), живой дамп r2-pmic.txt (блоки 0x0800 PON, 0x1000–0x1600 LBC, 0x4000 VM-BMS и др.).

Классификация сбоев (текущая цепочка: lk1st + DB410c TZ + qhypstub, с 30.09 00:31)

# Время Тип старта Точка остановки Что дальше pm_device_init, мкс batt, мВ
1 14:27:22 warm reboot -f lk target_init() (до «MMC card») самосброс через 15.0 с 11773 4188
2 15:41:10 power-on, класс A после SBL1, End (нет UART_DM/lk) стоит, нужен power-cycle 11254 4199
3 15:45:06 power-on SBL1 DDR (после Pre_DDR_clock_init) стоит 17202 (аномалия) –
4 17:47:07 warm reboot -f SBL1 DDR (после Pre_DDR_clock_init) стоит 11742 –
5 18:00:31 power-on, класс A после SBL1, End стоит (нового нет в NOTES) 11285 4193
6 23:10:47 power-on (перестановка АКБ) SBL1 DDR стоит 11803 –
7 23:26:59 power-on после SBL1, End стоит >10 мин 16317 (аномалия; pm_driver 13938, cdt 25437) 4202
8 23:40:25→39 power-on Linux, тишина после 1.9 с (/init, до модема) сброс через ~10.6 с после последнего вывода 11742 4198
9 23:40:39 сброс класса A lk target_init() самосброс через 11.0 с 11285 4197
10 23:40:50 сброс класса A после SBL1, End стоит 11224 4197
11 02:49:13 warm reboot -f lk target_init() самосброс через 15.0 с 11742 4192
(12) 22:00:55 power-on Linux, тишина с t=13.4 с (сразу после SET online модема) висит 4 мин до power-cycle 11773 (pm_driver 8265, PBL 214 мс: слегка аномально) 4200

EDL-входы (остановка после clock_init, D=30) исключены: это штатный Sahara-путь.

Наблюдения

O1. Два вида старта по телеметрии SBL1 (бимодальность)

  • Класс B (норма): pm_device_init 11.71–11.86 мс, SBL1 Start ≈ 155–160 мс. Сюда входят все warm reboot -f и все старты с PON_REASON=USB (pc4/5/6, 22:26).
  • Класс A: pm_device_init 11.22–11.32 мс, SBL1 Start чаще ≈ 122–134 мс (PBL на ~33 мс короче). Сюда попали ручные power-cycle 15:43, 22:05, спонтанные сбросы 23:40:39/50 и reboot-edl из lk.
  • PON reason для класса A ни разу не снимался: все захваты PON пришлись на старты класса B. Гипотеза: это рестарт без полного POR PMIC (SMPL / hard reset / KPD), а не USB-insertion. SMPL-триггер включён (PON 0x880 = 0xFE, бит1).

O2. «SBL1 End → нет lk» почти исключительно в классе A

  • Текущая цепочка: класс A — 3 зависания после SBL1 End плюс 1 зависание lk на 9 стартов. Класс B — 1 такое зависание на ~40 стартов, и это 23:26:59 с аномальными PMIC-таймингами.
  • Stock-цепочка (stock TZ/hyp/aboot): класс A — 0 из 5, после SBL1 End зависаний не было ни разу.
  • Точка остановки лежит между выходом SBL1 в QSEE (DB410c TZ) → qhypstub → первой строкой lk (UART_DM init). Это до lk1st/cache/B6P.
  • Вывод (вероятный, не доказан): зависание на стыке stock SBL1 ↔ DB410c TZ/qhypstub на non-POR старте. Например, TZ/hyp по-разному обрабатывают сохранившееся состояние (IMEM/cookies/warm-boot) после неполного обесточивания. При холодном POR проблема не проявляется.

O3. Warm reboot -f из mainline ненадёжен

  • 9 warm reboot → 3 сбоя: 2× зависание lk в инициализации eMMC (target_init до «MMC card») с самосбросом через ровно ~15 с и 1× зависание SBL1 в DDR-init.
  • Stock Android warm-restart (Restarting system…): 0 сбоев на ~9.
  • Кандидаты: mainline/PSCI SYSTEM_RESET оставляет eMMC или DDR в состоянии, которое stock SBL1 и lk не ожидают (нет eMMC power-off notify/CMD0, DDR не в self-refresh). Для автономной работы это не важно: B6P не делает warm reboot.

O4. Самосбросы через 11–15 с: не APSS WDT и не PMIC WD (по крайней мере в штатном состоянии)

  • APSS WDT 0x0B017000: EN=0, STS=0, BARK/BITE = значения по умолчанию. В DT узла нет, ядро его не трогает.
  • watchdog0 — это PMIC PON WD: 0x857=0x00 (выключен), S1=0x3c.
  • KPDPWR S1+S2 (0x840/0x841 = 10.256+2 с, reset enabled 0x843=0x80) ≈ 12.3 с. Близко к 11–15 с, но это потребовало бы нажатой кнопки питания. Не доказано.
  • Кто сбрасывает зависший lk через ~15 с после warm reboot, не установлено. Кандидаты: watchdog, взведённый TZ на время загрузки, и KPDPWR.

O5. Электрические признаки

  • batt_voltage 4183–4202 мВ на всех стартах текущей цепочки, включая все сбои. Проблема не в разряженной АКБ (stock-сессии шли при 3.86–4.13 В без сбоев).
  • 2 из 2 стартов с аномально долгими PMIC-шагами SBL1 (pm_device_init +5 мс, pm_driver_init +6 мс) закончились зависанием (#3, #7). Замедление приходится на SPMI/PMIC-операции, а не на всё подряд. Это признак PMIC «в процессе» (дребезг питания или контакта во время старта).
  • #6, #8–#10 пришлись на моменты, когда пользователь трогал АКБ.
  • #12 (22:00): Linux замолчал на t=13.4 с сразу после включения модема (рост тока). Кандидат на просадку питания, но PON не снят.
  • POFF 0x80D=UVLO фиксируется и при обычном ручном обесточивании (pc5/pc6 после user power-cycle). Значит, UVLO в POFF сам по себе не доказывает просадку в работе. Вывод по 22:26 (pc2) нужно ослабить до «вероятно».
  • PON 0x807 (PBL_STATUS): pc4=0x98 (чистое обесточивание, 0x80D=00), pc5/pc6=0xC8 (UVLO latched). Семантика битов в downstream-драйвере не описана, это только корреляция.
  • LBC: BAT_IF 0x1208=0x83 (АКБ определена), USB_CHGPTH 0x1310=0x03. power_supply/vadc драйверов в ядре нет, живого Vbat из Linux нет.

Вердикт (текущий, по вероятности)

  1. Питание/контакт АКБ — главный триггер. Сбои кучкуются при манипуляциях с АКБ и на стартах с аномальными PMIC-таймингами. Холодный старт класса B с закреплённой АКБ проходит ~40:1.
  2. Уязвимость цепочки к non-POR стартам (qhypstub/DB410c TZ ↔ stock SBL1). Она превращает дребезг питания в зависание вместо нормального перезапуска: класс A 4/9 против 0/5 на stock-цепочке. Это программный фактор, его можно исследовать дальше.
  3. Warm reboot из mainline — отдельный, воспроизводимый (~1/3) программный дефект (eMMC/DDR на warm reset). Для B6P не критичен.
  4. Аппаратный дефект SoC/DDR не подтверждается: при нормальных стартах DDR-init стабилен, batt_voltage в норме. Совсем исключить его нельзя.
  5. «Случайность» как объяснение отвергается: у сбоев есть устойчивые признаки (класс A, аномальные тайминги, warm reboot).

Что нужно дальше (руки пользователя; без записи во flash)

  • T1. Установить, что такое класс A: снимать PON 0x800–0x80F на каждом старте, дошедшем до Linux (pc-boot.sh уже это делает), и отдельно воспроизвести A: короткое выдёргивание АКБ при подключённом USB (SMPL?), нажатие кнопки питания.
  • T2. Матрица холодных стартов по 10 штук, UART + PON: (a) АКБ закреплена, USB вставляется последним; (b) USB подключён, АКБ вставляется последней; (c) старт кнопкой питания. Считать стадию остановки и класс A/B.
  • T3. Только USB без АКБ: по словам пользователя, плата не стартует. Один раз проверить с UART, чтобы увидеть, где именно она останавливается (PBL/SBL1/UVLO).
  • T4. (по желанию) Сравнить с stock-цепочкой на стартах класса A. Для этого нужна перепрошивка, и только по GO.