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

74 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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**.