jetson-optimize-memory

Par nvidia · skills

Récupérez de la DRAM en désactivant les sous-systèmes inutilisés dans MB1 BCT, MB2 BCT, la mémoire réservée du noyau et SWIOTLB. À utiliser pour les déploiements Jetson headless ou sans caméra ; ne convient pas au réglage des fréquences CPU/GPU.

npx skills add https://github.com/nvidia/skills --skill jetson-optimize-memory

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/#else source. 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 : headlesssudo 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 :

  1. Override auxp_controls@<index> :
    auxp_controls@<index> {
        enable_init    = <0>;
        enable_fw_load = <0>;
        enable_unhalt  = <0>;
    };
  2. /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é (ou aux_info@<id>U après expansion macro) a size = <0x0 0x0> et pref_base = <0x0 0x0>.
  • Chaque auxp_controls@<idx> désactivé a les trois champs enable_* à <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-source complé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_nslabs né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_used dépasse io_tlb_nslabs — annuler swiotlb= dans CMDLINE_ADD et 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.
  • dmesg de validation montre le sous-système désactivé toujours en cours de sondage — le changement n'a probablement pas remontée vers bsp_image ; relancer /jetson-promote-image.

Skills similaires