- deviceinfo / modules-initfs: boot through the U-Boot chainload, modules needed in the initramfs for the display, USB and the DSPs. - initfs hooks: dropbear/telnet debug shell over USB networking. - rtwo-panel-revive.service: blank/unblank the NT37705 if it comes up dead from the ABL handoff. - logind-power-key.conf: ignore the power key (handled by the dashboard). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DnHwDU5yL8L6qgPEN5CV5m
257 lines
16 KiB
Plaintext
257 lines
16 KiB
Plaintext
# Reference: <https://postmarketos.org/deviceinfo>
|
|
# Please use double quotes only. You can source this file in shell
|
|
# scripts.
|
|
|
|
deviceinfo_format_version="0"
|
|
deviceinfo_name="Motorola Moto Edge 40 Pro"
|
|
deviceinfo_manufacturer="Motorola"
|
|
deviceinfo_codename="motorola-rtwo"
|
|
deviceinfo_year="2023"
|
|
deviceinfo_dtb="qcom/sm8550-motorola-rtwo"
|
|
deviceinfo_arch="aarch64"
|
|
|
|
# Device related
|
|
deviceinfo_chassis="handset"
|
|
deviceinfo_keyboard="false"
|
|
deviceinfo_external_storage="true"
|
|
deviceinfo_screen_width="1080"
|
|
deviceinfo_screen_height="2400"
|
|
deviceinfo_getty="ttyMSM0;115200"
|
|
deviceinfo_no_framebuffer="true"
|
|
|
|
# UN SOLO initramfs, sin initramfs-extra. Es lo que hace que
|
|
# 'pmos.debug-shell' sirva de algo: init_2nd.sh (y con el, la rama
|
|
# if [ "$debug_shell" = "y" ]; then debug_shell; fi
|
|
# ) vive en el paquete de ficheros -extra, o sea DENTRO del rootfs, que en
|
|
# este equipo no podemos flashear. Con extra separado, jump_init_2nd() del
|
|
# stage 1 es un no-op, la bandera de la cmdline no la lee nadie y el unico
|
|
# camino a la shell de depuracion es agotar los 30 s de wait_boot_partition
|
|
# -> fail_halt_boot. Fusionandolo, init.sh salta a init_2nd.sh de inmediato,
|
|
# que hace setup_udev + setup_usb_network + start_unudhcpd y ENTONCES entra
|
|
# en debug_shell: telnet en 172.16.42.1:23 y getty en /dev/ttyGS0 en cuanto
|
|
# el USB enumera, sin depender de ninguna particion.
|
|
# El coste (initramfs de 3 MiB -> ~15 MiB) ya no importa: con cabecera v2 el
|
|
# ramdisk va DENTRO de boot.img, no en init_boot, y boot_a admite 96 MiB.
|
|
deviceinfo_create_initfs_extra="false"
|
|
# The stock LineageOS boot chain packs both Android-v4 ramdisks with LZ4
|
|
# legacy. When the bootloader concatenates our vendor_ramdisk with the
|
|
# init_boot ramdisk, a gzip stream after an LZ4-legacy one makes the
|
|
# kernel's unpacker choke ("invalid magic" -> panic unknown-block(0,0)).
|
|
# Match the stock format.
|
|
deviceinfo_initfs_compression="lz4:legacy"
|
|
|
|
# Bootloader: Android 13 GKI. The kernel goes in boot, the DTB + cmdline +
|
|
# initramfs in vendor_boot. init_boot holds the generic (first-stage)
|
|
# ramdisk - it MUST be replaced with pmOS's, or the stock AOSP /init runs.
|
|
# Lessons folded in from device-motorola-dubai (the closest working
|
|
# Motorola mainline port) and the stock LineageOS images.
|
|
deviceinfo_flash_method="fastboot"
|
|
# Keep flashing dtbo, and keep it EMPTY. The ABL overlays whatever sits in
|
|
# the dtbo partition on top of the DTB it took from vendor_boot, and a stock
|
|
# overlay applied to a mainline DTB mangles it - the documented advice for
|
|
# mainline on Qualcomm is to erase the dtbo partition or program NULL to it.
|
|
# The dtbo.img pmbootstrap generates here is 24 MiB of zeroes (no DTBO magic,
|
|
# no entries), so flashing it IS that "program NULL" step: it wipes the
|
|
# LineageOS/stock table (32 entries) that a restore-to-stock puts back.
|
|
# Do not drop this line expecting the ABL to skip overlays - dropping it
|
|
# leaves the stock table in place.
|
|
deviceinfo_flash_fastboot_partition_dtbo="dtbo"
|
|
deviceinfo_flash_fastboot_partition_vbmeta="vbmeta"
|
|
# CONSOLA REAL POR UART (2026-09-13, sin framebuffer en el .dts): console=
|
|
# apunta ahora a ttyMSM0 (uart7, GENI QUP0/SE7), no a tty0. Ya no hace falta
|
|
# el 'ignore_loglevel'+panic=5-como-sustituto-de-consola: si el UART vive,
|
|
# vemos todo en tiempo real.
|
|
#
|
|
# 'earlycon' AGREGADO DE NUEVO (2026-09-13, segunda pasada). Se habia sacado
|
|
# a proposito por el riesgo real y documentado de fragilidad en el handover
|
|
# clk/earlycon (serie LKML "clk: help OF platforms with their stdout
|
|
# (earlycon) clocks during early boot", aun en v6) combinado con la sospecha
|
|
# de que DisableHypUartUsageForLogging() (SMC que el ABL llama antes de
|
|
# saltar al kernel, ver rtwo-abl-vs-abl-de-referencia) deje el UART en un
|
|
# estado raro para un acceso CRUDO y tempranisimo. Pero: 'console=ttyMSM0'
|
|
# SOLO (sin earlycon) no muestra nada hasta que el driver real de
|
|
# qcom_geni_serial prueba, lo cual exige que GCC y el pinctrl ya hayan
|
|
# probado antes - y CADA cuelgue que vimos en este bring-up paso muchisimo
|
|
# antes de eso (reset en 1-2s, antes de fbcon). Si el problema sigue siendo
|
|
# pre-driver, sin earlycon no veriamos nada, igual que en todos los intentos
|
|
# anteriores con framebuffer. Sin argumento usa /chosen/stdout-path (serial0
|
|
# -> &uart7, qcom,geni-debug-uart tiene OF_EARLYCON_DECLARE).
|
|
#
|
|
# 'panic=5': con consola real ya no es indispensable, pero se deja: si
|
|
# panickea en vez de colgarse, lo vemos en pantalla Y el registro queda en
|
|
# pstore/ramoops para la proxima vez.
|
|
# 'pmos.debug-shell': shell de depuracion por USB (telnet 172.16.42.1) con
|
|
# dmesg y pstore montados, si se llega al stage 2 del initramfs.
|
|
# 'allow_mismatched_32bit_el0' AGREGADO (2026-09-14): AYN Thor (mismo SoC,
|
|
# SD8 Gen 2 = SM8550, arranca ABL-directo sin U-Boot igual que nosotros) lo
|
|
# lleva en su receta de cmdline. Sin el, en el peor caso el kernel solo
|
|
# restringe apps de 32 bits en runtime (no bloquea el arranque segun el
|
|
# codigo fuente) - pero es gratis agregarlo: solo relaja una verificacion,
|
|
# nunca puede empeorar nada.
|
|
# 'console=tty0 ignore_loglevel' AGREGADO (2026-09-17): consola visual sobre
|
|
# el framebuffer@b8000000 reagregado al .dts del kernel, ver ese archivo.
|
|
# 'console=ttyMSM0,115200n8' SACADO (2026-09-18): no hay UART real
|
|
# enganchado en este bring-up, la consola que se usa de verdad es la de
|
|
# framebuffer (tty0, ver foto). Se deja 'earlycon' (bare, sin argumento)
|
|
# porque igual sale por /chosen/stdout-path sin bloquear nada aunque nadie
|
|
# lo lea.
|
|
# 'printk.devkmsg=on' AGREGADO (2026-09-21): con systemd.log_target=kmsg
|
|
# (ver qcom-phone.env), TODO el log visible en la consola de framebuffer
|
|
# sale de que systemd escribe activamente a /dev/kmsg -- inicialmente se
|
|
# penso que el kernel (printk.devkmsg=ratelimit por default) era el que
|
|
# cortaba esas escrituras con un rate-limit agresivo, disparando "Too many
|
|
# messages being logged to kmsg, ignoring" a los ~2-3s de systemd. FALSO,
|
|
# confirmado en hardware: con SOLO este flag el freeze sigue exactamente
|
|
# igual, misma linea. Se deja de todos modos (no molesta), ver el flag de
|
|
# abajo para el fix real.
|
|
# 'systemd.log_ratelimit_kmsg=false' AGREGADO (2026-09-21, segundo
|
|
# intento): el rate-limit real es del propio systemd, no del kernel --
|
|
# write_to_kmsg() en systemd tiene su PROPIO limitador interno para
|
|
# escrituras a /dev/kmsg, totalmente independiente de printk.devkmsg.
|
|
# Documentado en systemd(1)/kernel-command-line(7) como
|
|
# $SYSTEMD_LOG_RATELIMIT_KMSG / systemd.log_ratelimit_kmsg= (boolean,
|
|
# default true). CONFIRMADO EN HARDWARE QUE ESTE FLAG TAMPOCO ALCANZA: el
|
|
# usuario reportó que después del freeze NO aparece ningún mensaje nuevo,
|
|
# ni siquiera los timeouts de WMI del kernel que se repiten cada ~13s
|
|
# (esos SÍ se siguen generando en el ring buffer real, confirmado por
|
|
# SSH). Descarta cualquier teoría de "se generan menos mensajes" -- el
|
|
# framebuffer literalmente deja de refrescarse, sin relación con volumen
|
|
# de logging.
|
|
# 'cpufreq.default_governor=performance' AGREGADO (2026-09-21, tercer
|
|
# intento, DIAGNÓSTICO): el .dts del kernel
|
|
# (sm8550-motorola-rtwo.dts líneas 721-754) ya documenta que dispcc
|
|
# habilitado por defecto glitchea disp_cc_mdss_mdp_clk_src (el reloj de
|
|
# píxeles del MDP que el ABL/U-Boot deja corriendo para seguir escaneando
|
|
# el framebuffer heredado), fix aplicado ahí ('&dispcc { status =
|
|
# "disabled"; }', confirmado vigente) -- pero el freeze persiste con ese
|
|
# fix puesto, así que algo MÁS sigue tocando ese mismo reloj heredado por
|
|
# una vía distinta. Hipótesis: GCC comparte una PLL padre con ese reloj de
|
|
# píxeles, y el escalado dinámico de cpufreq (que arranca justo cuando el
|
|
# boot termina y baja la carga -- la misma ventana donde aparece el
|
|
# freeze) la glitchea indirectamente. Este flag fija el governor a
|
|
# 'performance' para probar si evita el glitch. CONFIRMADO EN HARDWARE QUE
|
|
# TAMPOCO ALCANZA: freeze idéntico con el governor fijo -- descarta
|
|
# cpufreq DVFS.
|
|
#
|
|
# Con 4 hipótesis descartadas con evidencia real (rate limit kernel, rate
|
|
# limit systemd, cpufreq, y el mecanismo de dispcc vía otro controlador --
|
|
# dmesg | grep WARNING/clk_rcg2/update_config/genpd no muestra nada salvo
|
|
# "PM: genpd: Not disabling unused power domains", y el usuario confirmó
|
|
# que el freeze pasaba INCLUSO ANTES de que existieran los nodos de WiFi
|
|
# en el .dts, descartando PCIe/ath12k), toca dejar de adivinar QUÉ driver
|
|
# específico es y aislar CUÁNDO pasa.
|
|
# 'systemd.mask=systemd-udev-trigger.service' PROBADO (2026-09-21, cuarto
|
|
# intento): CONFIRMADO EN HARDWARE que con esto el freeze DESAPARECE
|
|
# (pantalla mostró "emergency mode" en vez de congelarse) -- prueba
|
|
# definitiva de que es un driver/módulo cargado durante el coldplug de
|
|
# udev, no un timeout de hardware. Pero bloquear el coldplug entero rompe
|
|
# el boot normal (cae a emergency mode sin red, probablemente porque el
|
|
# descubrimiento de particiones/interfaz USB de red también depende de
|
|
# udev). SACADO, reemplazado por el flag de abajo para bisectar sin
|
|
# romper el boot.
|
|
# 'module_blacklist=gpucc_sm8550,videocc_sm8550,camcc_sm8550' AGREGADO
|
|
# (2026-09-21, quinto intento) -- CONFIRMADO EN HARDWARE QUE ES EL FIX:
|
|
# con estos 3 bloqueados, boot completo normal (SSH/red ok) y la pantalla
|
|
# llega al login prompt sin congelarse. NO se aisló cuál de los tres en
|
|
# particular es el culpable real -- el bring-up actual no necesita
|
|
# GPU/video-codec/cámara, así que no vale la pena bisectar más por ahora.
|
|
# Si en el futuro hace falta reactivar alguno (ej. GPU para aceleración
|
|
# gráfica), sacarlo de esta lista de a uno y probar en hardware; si
|
|
# individualmente reproduce el freeze, deshabilitarlo a nivel .dts
|
|
# (status = "disabled", mismo patrón que dispcc) en vez de blacklistear
|
|
# el módulo. FIX VIGENTE.
|
|
# 'gpucc_sm8550' SACADO de la lista (2026-09-21) para empezar el
|
|
# bisect de a uno, siguiendo el plan de arriba -- es el primer candidato
|
|
# porque es el unico de los tres con un caso de uso real a corto plazo
|
|
# (aceleracion grafica). El .dts no tiene NINGUN nodo de GPU (no hay
|
|
# Adreno/zap-shader, se verifico: sm8550-motorola-rtwo.dts no menciona
|
|
# "adreno"/"gpu@" en ningun lado), asi que gpucc queda habilitado por
|
|
# defecto desde sm8550.dtsi (como dispcc, ver comentario de &dispcc mas
|
|
# abajo) sin ningun consumidor todavia. Si el freeze vuelve, la sospecha
|
|
# recae en gpucc_sm8550 y el fix pasa a &gpucc { status = "disabled"; }
|
|
# en el .dts en vez del blacklist. videocc_sm8550/camcc_sm8550 SIGUEN
|
|
# blacklisteados -- no bisectar los tres a la vez.
|
|
# 'videocc_sm8550' SACADO de la lista (2026-09-21, mismo dia, mas tarde):
|
|
# reset random confirmado en hardware CON gpucc_sm8550 ya reactivado (asi
|
|
# que gpucc queda descartado como causa unica del reset). Leyendo el
|
|
# fuente real de gdsc_init() (drivers/clk/qcom/gdsc.c) contra los GDSC de
|
|
# cada controlador: video_cc_mvs0_gdsc/mvs1_gdsc tienen la flag
|
|
# HW_CTRL_TRIGGER (control autonomo por hardware del colapso de energia),
|
|
# la MISMA clase de flag que mdss_gdsc/mdss_int2_gdsc de dispcc (HW_CTRL) --
|
|
# dispcc tambien cambio de habilitado a disabled en el mismo fix del
|
|
# freeze, asi que es sospechoso que comparta este patron con videocc.
|
|
# camcc_sm8550 NO tiene ningun GDSC con HW_CTRL/HW_CTRL_TRIGGER/VOTABLE
|
|
# (todos "planos", solo POLL_CFG_GDSCR|RETAIN_FF_ENABLE) -- por eso queda
|
|
# BLACKLISTEADO todavia, es el candidato menos sospechoso de los tres.
|
|
# CONFIRMADO EN HARDWARE 2026-09-22: el reset random no volvio a pasar con
|
|
# videocc_sm8550 reactivado (junto con cpuidle.off=1 y CONFIG_GUNYAH_WATCHDOG,
|
|
# ver comentarios de abajo) -- no se aislo cual de los tres exactamente era
|
|
# necesario, pero con los tres juntos el reset desaparecio. No bisectar mas
|
|
# a menos que vuelva a aparecer.
|
|
# NOTA: esta linea documenta la cmdline "canonica" del dispositivo, pero el
|
|
# flujo de arranque VIGENTE es el chainload de U-Boot (ver
|
|
# rtwo-uboot-chainload en las notas del proyecto), que ignora esto y usa en
|
|
# cambio pmos_bootargs de ~/pmos/uboot-chainload/qcom-phone.env (mantenida
|
|
# en sincronia a mano con esta linea).
|
|
# 'ath12k.debug_mask=0x66' QUITADO 2026-09-22 (sincronizado con deviceinfo):
|
|
# el WiFi ya funciona y ese mask inundaba dmesg con cada header HTC RX y cada
|
|
# mensaje WMI (bits 0x2|0x4|0x20|0x40, solo presentes con CONFIG_ATH12K_DEBUG=y).
|
|
# Si vuelve a hacer falta diagnostico, re-agregar exactamente asi: ath12k.debug_mask=0x66
|
|
deviceinfo_kernel_cmdline="earlycon console=tty0 quiet splash panic=5 allow_mismatched_32bit_el0 random.trust_cpu=on printk.devkmsg=on systemd.log_ratelimit_kmsg=false cpufreq.default_governor=performance cpuidle.off=1 module_blacklist=camcc_sm8550 msm.separate_gpu_kms=1 deferred_probe_timeout=30"
|
|
# 'cpuidle.off=1' AGREGADO (2026-09-21): prueba para aislar si el reset
|
|
# random (siempre dentro de los primeros 5 min, nunca mientras corre algo)
|
|
# es un cuelgue al entrar/resumir de un C-state profundo via PSCI
|
|
# CPU_SUSPEND -- no hay overrides de idle-states/cpuidle en este .dts,
|
|
# heredamos lo que trae sm8550.dtsi sin validar en este hardware. Con esto
|
|
# las CPU solo usan WFI simple, nunca los estados profundos.
|
|
# CONFIRMADO EN HARDWARE 2026-09-22: el reset random no volvio a aparecer
|
|
# con esto puesto (junto con videocc_sm8550 reactivado y
|
|
# CONFIG_GUNYAH_WATCHDOG=y, ver arriba) -- FIX VIGENTE, no sacar. No se
|
|
# aislo cual de los tres cambios era el necesario especificamente; si algun
|
|
# dia hace falta reactivar cpuidle (ej. por consumo de bateria), bisectar
|
|
# de a uno en vez de sacar los tres juntos.
|
|
# CONFIG_GUNYAH_WATCHDOG=y (drivers/watchdog/gunyah_wdt.c, protocolo SMC con
|
|
# techo de ~32s) tambien esta activo -- no encajaba bien con la
|
|
# variabilidad de 0-5min del reset visto originalmente, pero se dejo activo
|
|
# sin costo real (el driver apaga el watchdog al hacer probe() si nadie
|
|
# abre /dev/watchdog) y forma parte del combo que resolvio el reset.
|
|
# CABECERA v2, NO v4 - y esta es la razon de fondo:
|
|
# DTBImgCheckAndAppendDT() coge el DTB de sitios distintos segun la version.
|
|
# v3/v4: ImageBuffer = vendor_boot, DtbOffset = dentro de vendor_boot. Si el
|
|
# match de qcom,msm-id/board-id falla, el fallback de "single appended
|
|
# DTB" calcula ImageBuffer(=BOOT.IMG) + DtbOffset(=de vendor_boot), o
|
|
# sea apunta DENTRO DEL KERNEL -> fdt_check_header falla ->
|
|
# EFI_NOT_FOUND -> LoadImageAndAuth falla -> el ABL de Motorola hace
|
|
# "Rebooting to retry" -> bootloop de 7 y a fastboot.
|
|
# v2: ImageBuffer y DtbOffset son AMBOS del boot.img, asi que el fallback
|
|
# funciona y acepta nuestro DTB SIN comparar ningun ID.
|
|
# O sea: con v4 dependemos de acertar msm-id/board-id exactos; con v2 no
|
|
# dependemos de nada. device-motorola-dubai (mismo ABL de Motorola, puerto
|
|
# mainline que SI arranca) usa v2 por esto mismo.
|
|
deviceinfo_generate_bootimg="true"
|
|
deviceinfo_header_version="2"
|
|
deviceinfo_append_dtb="true"
|
|
deviceinfo_flash_offset_base="0x00000000"
|
|
deviceinfo_flash_offset_kernel="0x00008000"
|
|
deviceinfo_flash_offset_ramdisk="0x01000000"
|
|
deviceinfo_flash_offset_second="0x00000000"
|
|
deviceinfo_flash_offset_tags="0x00000100"
|
|
deviceinfo_flash_offset_dtb="0x01f00000"
|
|
deviceinfo_bootimg_qcdt="false"
|
|
deviceinfo_flash_pagesize="4096"
|
|
# Stock uses base 0 (mkbootimg defaults to 0x10000000, dtb ends up outside
|
|
# RAM). os_* to satisfy anti-rollback on the boot image.
|
|
deviceinfo_bootimg_custom_args="--base 0x00000000 --kernel_offset 0x00008000 --ramdisk_offset 0x01000000 --tags_offset 0x00000100 --dtb_offset 0x01f00000 --os_version 16.0.0 --os_patch_level 2026-08-01"
|
|
deviceinfo_flash_sparse="true"
|
|
|
|
# UFS storage
|
|
deviceinfo_rootfs_image_sector_size="4096"
|
|
|
|
# A/B device (androidboot.slot_suffix=_a). UFS controller: 1d84000.ufshc.
|
|
# Dynamic "super" partition (group "mot_dp_group", ~9.94 GB) holds
|
|
# system/system_ext/product/vendor/vendor_dlkm/system_dlkm. Resolve the real
|
|
# node from the initramfs debug shell:
|
|
# ls -l /dev/disk/by-partlabel/super
|
|
# then uncomment (both fields = the super partition, A and B share it here):
|
|
# deviceinfo_super_partitions="/dev/disk/by-partlabel/super /dev/disk/by-partlabel/super"
|