jetson-optimize-memory
La mémoire est réservée sur quatre couches ordonnées par chronologie de démarrage (ligne supérieure = plus tôt au démarrage, plus proche du matériel) :
| Couche | Contenu | Fichiers clés |
|---|---|---|
| MB1 BCT | firmware carveouts | misc DTS par module |
| MB2 BCT | chargement firmware + contrôles AST | misc DTS par module |
| Kernel DTS | reserved-memory et liaison driver | DTS par module |
| SWIOTLB | taille du pool de rebond DMA | <module>.conf.common (CMDLINE_ADD) |
Règles critiques :
- Seuls les scénarios dans Scenario recipes sont validés. Refusez toute demande de désactiver un carveout/cluster/nœud absent de ce tableau.
- Annuler un carveout nécessite les deux : désactiver les contrôles de chargement du cluster ET supprimer l'AST qui le référence.
- Émettre des overrides explicites pour chaque cluster dans la recette, peu importe
l'apparence du
#ifdef/#elsesource. Vérifier le binaire fusionné. - La pile GPU SW doit correspondre à la puce : T234 → nvgpu, T264 et plus tard
→ OpenRM. Suivre la règle de plateforme dérivée partagée dans
target-platform-contract.md; s'arrêter en cas de décalage au lieu de deviner. - Ne pas définir SWIOTLB à 0 — certains périphériques ne peuvent pas utiliser l'IOMMU.
Scenario recipes
| Mot-clé | Carveouts MB1 BCT | MB2 BCT | Kernel DTS |
|---|---|---|---|
headless |
Famille DCE (voir tableau chip) | DCE auxp_controls + AST(s) DCE |
display@<addr> (et dce@<addr> si exposé) → désactivé |
no-camera |
Famille RCE/VI/ISP | RCE auxp_controls (chaque instance) + AST(s) RCE |
recommandé : VI/ISP/NVCSI → désactivé |
Carveouts spécifiques à la puce
| Scénario | T234 (Orin) | T264 (Thor) |
|---|---|---|
headless |
CARVEOUT_BPMP_DCE, CARVEOUT_DCE, CARVEOUT_DCE_TSEC, CARVEOUT_TSEC_DCE, CARVEOUT_DISP_EARLY_BOOT_FB |
CARVEOUT_DCE, CARVEOUT_TSEC_DCE, CARVEOUT_HPSE_DCE, CARVEOUT_DISP_EARLY_BOOT_FB |
no-camera |
CARVEOUT_RCE, CARVEOUT_CAMERA_TASKLIST |
CARVEOUT_RCE, CARVEOUT_RCE1, CARVEOUT_RCE_RW, CARVEOUT_VI_TASKLIST, CARVEOUT_VI1_TASKLIST, CARVEOUT_ISP_TASKLIST, CARVEOUT_ISP1_TASKLIST |
Post-démarrage :
headless→sudo systemctl set-default multi-user.target.
Overrides carveout MB1 BCT
Fichier : Linux_for_Tegra/bootloader/generic/BCT/tegra<chip>-mb1-bct-misc-<module>.dts
(p. ex. tegra234-mb1-bct-misc-p3767-0000.dts pour Orin Nano,
tegra264-mb1-bct-misc-p3834-0008-p4071-0000.dts pour Thor).
Pour chaque carveout, ajouter à l'intérieur du nœud carveout existant :
aux_info@<CARVEOUT_NAME> {
pref_base = <0x0 0x0>;
size = <0x0 0x0>;
alignment = <0x0 0x0>;
};
Overrides cluster MB2 BCT + AST
Fichier : Linux_for_Tegra/bootloader/generic/BCT/tegra<chip>-mb2-bct-misc-<module>.dts
(inclut tegra<chip>-mb2-bct-common.dtsi).
Pour chaque cluster cible :
- Override
auxp_controls@<index>:auxp_controls@<index> { enable_init = <0>; enable_fw_load = <0>; enable_unhalt = <0>; }; /delete-node/ auxp_ast_config@<idx>;
Chercher les indices dans common.dtsi : auxp_controls@N porte un commentaire
nommant son cluster ; auxp_ast_config@N contient des enfants ast_region dont
les lignes carveout = <CARVEOUT_…>; identifient le propriétaire.
Kernel DT reserved-memory
DTB=Linux_for_Tegra/kernel/dtb/<platform-dtb-name>.dtb
dtc -I dtb -O dts -o /tmp/platform.dts $DTB
# éditer : status = "disabled" sur les nœuds cibles
dtc -I dts -O dtb -o $DTB /tmp/platform.dts
Affichage — désactiver display@<addr>, plus dce@<addr> s'il est exposé comme
un nœud kernel séparé.
Caméra — sous host1x@<addr>, désactiver ceux parmi vi* / isp*
/ nvcsi qui existent sur le BSP (émettre uniquement les nœuds présents) :
Localiser le nœud du contrôleur d'affichage dans le DTS décompilé et le désactiver.
L'adresse unitaire du nœud est spécifique à la puce — la trouver par chaîne
compatible (p. ex. nvidia,tegra234-display) plutôt que de coder l'adresse en dur.
host1x@<addr> {
vi0@<addr> { status = "disabled"; };
vi1@<addr> { status = "disabled"; };
isp@<addr> { status = "disabled"; };
isp1@<addr> { status = "disabled"; };
nvcsi@<addr> { status = "disabled"; };
};
Pool de rebond DMA SWIOTLB
L'IOMMU NVIDIA couvre le DMA périphérique, donc SWIOTLB est rarement utilisé.
Éditer CMDLINE_ADD (jamais CMDLINE) dans Linux_for_Tegra/<module>.conf.common :
# Octets totaux = swiotlb_value × 2048 ; pool de 4 MiB :
CMDLINE_ADD="... swiotlb=2048"
Vérification des overrides (obligatoire)
Après chaque .dts BCT M1/M2 patchés, reproduire la compilation + décompilation du BSP
en utilisant les mêmes drapeaux -D… de bct_flags.append(...) dans
bootloader/tegraflash_impl_t<chip>.py :
gcc -E -nostdinc -x assembler-with-cpp \
-DENABLE_<FLAG_1> -DENABLE_<FLAG_2> \
-I bootloader -I bootloader/generic/BCT \
-o /tmp/cpp.dts <patched-bct.dts>
dtc -q -I dts -O dtb -o /tmp/cpp.dtb /tmp/cpp.dts
dtc -q -I dtb -O dts /tmp/cpp.dtb | less
Confirmer dans la sortie fusionnée :
- Chaque
aux_info@<NAME>annulé (ouaux_info@<id>Uaprès expansion macro) asize = <0x0 0x0>etpref_base = <0x0 0x0>. - Chaque
auxp_controls@<idx>désactivé a les trois champsenable_*à<0>. - Chaque
auxp_ast_config@<idx>supprimé par/delete-node/est absent.
Vérification (sur cible amorcée)
sudo cat /proc/iomem | grep -iE 'nv-reserved|cma|fb|carveout'
ls /proc/device-tree/reserved-memory/
dmesg | grep -iE 'firmware|carveout|bpmp|reserved|fail|error' | head -20
free -m
| Scénario | Sysfs | dmesg grep |
|---|---|---|
| Affichage désactivé | ls /sys/class/drm/ (vide) |
tegra-drm\|nvdisplay\|dce\|host1x\|fb0 |
| Caméra désactivée | ls /dev/video* 2>/dev/null (aucun) |
rce\|nvcsi\|tegra-camera\|vi0\|vi1\|isp |
| Réduction SWIOTLB | cat /sys/kernel/debug/swiotlb/io_tlb_nslabs correspond à cmdline |
swiotlb |
Pour SWIOTLB : /proc/cmdline doit contenir swiotlb=<value>, et
watch -n5 cat /sys/kernel/debug/swiotlb/io_tlb_used doit rester sous
io_tlb_nslabs lors de la charge complète — en cas de dépassement, restaurer
CMDLINE_ADD original et reflasher kernel-dtb.
Objectif
Réduire les carveouts DRAM inutilisés activés par défaut dans le BSP de référence quand un déploiement Jetson supprime l'affichage, la caméra ou d'autres périphériques, libérant les octets récupérés pour l'application. Édite toujours les quatre couches dans l'ordre de démarrage afin qu'un carveout précoce ne dépasse jamais une réduction ultérieure.
Prérequis
- Profil cible actif résolu selon
../../context/target-platform-contract.md. - Image BSP extraite et arborescence source initialisée
(
/jetson-init-image,/jetson-init-sourcecomplétés). - Pour les recettes headless / no-camera : confirmer que la charge de travail ne nécessite vraiment pas l'affichage ou la caméra.
Limitations
- Seules les recettes validées (
headless,no-camera,swiotlb) sont exposées ; les désactivations ad-hoc de sous-système hors ensemble de recette sont refusées. - La réduction SWIOTLB est limitée par le pic de DMA en vol — dépasser le nouveau
io_tlb_nslabsnécessite de revenir en arrière. - Les édits BPMP-DTB arrivent dans le suivi de superposition seulement après exécution de Customize + Build + Deploy ; cette compétence ne flashe pas seule.
Dépannage
- Démarrage échoue après désactivation du carveout MB1 BCT — restaurer le misc DTS vierge et reflasher ; le carveout manquant est obligatoire pour le SoC actif.
io_tlb_useddépasseio_tlb_nslabs— annulerswiotlb=dansCMDLINE_ADDet reflasher la partition kernel DTB.- Différence récupérée plus petite que prévu — vérifier que la recette a vraiment
correspondance avec le déploiement (p. ex. affichage toujours connecté) ; utiliser la
vérification
dmesg | grep -iE 'firmware|carveout'dans ce fichier pour confirmer. dmesgde validation montre le sous-système désactivé toujours en cours de sondage — le changement n'a probablement pas remontée versbsp_image; relancer/jetson-promote-image.