Jetson Customize Pcie
NVIDIAOfficialCreated by Jetson TeamDistributed by NVIDIA
- Skill
- Workflow
- Software development
- Apache-2.0
- Medium risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill manages the per-controller configuration for PCIe on Jetson Thor and Orin platforms. It operates by generating kernel-DT overlay fragments to define controller status, lane width, and link speed. It ensures consistency between the kernel device tree and the BPMP-side ODMDATA settings, which are managed by the sibling jetson-customize-uphy skill. The process involves topology analysis, pin verification against carrier schematics, and the generation of overlay commits for the BSP source repository.
What it does
- Analyzes PCIe topology differences between reference devkits and custom carriers.
- Verifies required PCIe sideband signals (CLKREQ, RST) against carrier pinmaps and schematics.
- Generates kernel-DT overlay fragments to enable or configure PCIe controllers.
- Performs consistency checks between kernel-DT overlays and ODMDATA settings.
- Maintains a run-state JSON sidecar to track configuration history.
- Integrates with the broader BSP customization workflow for Jetson platforms.
When to use it
- When configuring PCIe controllers on a custom Jetson carrier board.
- When a PCIe slot or M.2 receptacle fails to enumerate after flashing.
- When PCIe links train at incorrect widths or speeds.
- After running jetson-customize-uphy to reallocate lanes across controllers.
Advantages
- Ensures hardware-software alignment through schematic and pinmap verification.
- Prevents configuration drift by cross-checking ODMDATA and kernel-DT settings.
- Automates the creation of complex kernel-DT overlay fragments.
- Provides a structured, repeatable workflow for custom carrier bring-up.
Usage examples
- “Configure PCIe controller C3 for my custom Orin carrier.”
- The agent will analyze the current UPHY state, verify the carrier pinmap for C3, and generate the necessary kernel-DT overlay fragment to enable the controller.
- “My M.2 slot is training at x1 speed instead of x4, please fix it.”
- The agent will compare the current kernel-DT configuration against the carrier schematic and UPHY allocation, then update the overlay to set the correct lane width.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/nvidia/jetson-customize-pcie/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip jetson-customize-pcie.zip -d .agents/skills
Documentation by Jetson Team
Customize PCIe (per-controller status / lanes / speed)
Overview
PCIe on Tegra264 (Thor, [email protected]) and Tegra234 (Orin,
[email protected]) is split across multiple controllers that share the
UPHY lane pool with USB3 / MGBE / UFS. Each controller's runtime
behavior is determined by two surfaces, both required:
| Surface | Target | Authoritative for |
|---|---|---|
ODMDATA pcie@N_status=… (+ pcie@N_max-link-speed, pcie@N_pcie-mode, pcie@N_clk-scheme, pcie-cN-endpoint-enable) | /pcie/pcie@N in BPMP DTB | UPHY lane power, refclk gating, controller-side power rails |
Kernel-DT overlay on &pcieN | /bus@0/pcie@<addr> in kernel DTB | Kernel probe, lane width, link speed, RC/EP mode |
Skipping the kernel overlay on a disable lets the kernel probe a powered-down PHY (link timeouts in dmesg). Skipping the ODMDATA token on a disable leaves BPMP holding the PHY hot.
Agentic, not table-driven — no controller table, no
questions.json. Every controller, lane width, schematic-routed
receptacle, and authoritative DT node address is discovered at runtime
from the docs + DTB + carrier pinmap.
The output is a kernel-DT overlay commit only. Per-controller
fragment@N blocks are appended to the composite custom overlay
.dts per
../../references/bsp-customization-kernel-dtb.md
and committed to the bsp_sources/ hardware repo.
/jetson-build-source compiles the composite to .dtbo and owns its
Makefile + flash-conf registration.
This skill MUST NOT edit ODMDATA="...". All ODMDATA tokens
(pcie@N_status=…, pcie@N_max-link-speed, pcie@N_pcie-mode,
pcie@N_clk-scheme, pcie-cN-endpoint-enable, plus the
uphyX-config-N surface tokens and UPHY_CONFIG="" clear) are
emitted by /jetson-customize-uphy in a single atomic commit on the
carrier flash-conf fork. The allocation table this skill consumes
from the UPHY sidecar already tells the operator which controllers
are okay / disabled / per-lane sized; this skill only translates
that table into kernel-DT overlay fragments and verifies that the
overlay agrees with the ODMDATA already committed by customize-uphy
(consistency check in Step 8 — disagreement is reported, not silently
fixed).
When to invoke
The user says "configure PCIe", "enable PCIe controller", "set PCIe num-lanes", "change PCIe link speed", or asks to flip a
pcie@N_statustoken.A specific PCIe slot or M.2 receptacle doesn't enumerate after flash, OR the link trains at the wrong width / speed.
jetson-customize-uphyran and re-allocated lanes across PCIe controllers (e.g. switched fromuphy0-config-7touphy0-config-6enabling PCIe C3); the per-controller side now needs to be brought up.jetson-customize-mgbereports the QSFP path is wired but the kernel doesn't probe its PCIe-side companion (rare; XFI configurations).
Prerequisites:
Active profile with
reference_devkit:+custom_carrier:blocks.<source.root_path>/Linux_for_Tegra/.gitexists (/jetson-init-source)./jetson-derive-carrierhas run — carrier flash-conf fork is in the overlay tracker./jetson-customize-uphyhas run — its JSON sidecar at<workspace>/target-platform/<profile-stem>.jetson-customize-uphy.jsondrives the per-controllerenabledecision.Source-of-truth docs registered or supplied at prompt: Adaptation Guide, Module Design Guide, SoC TRM.
When
custom_carrier:is present, bothdocuments.custom_carrier_schematicANDdocuments.custom_carrier_pinmux_xlsare REQUIRED. Refuse the run if either is missing — routing on a custom carrier cannot be guessed. Reference-devkit-only profiles skip this check.dtcon PATH.
Procedure (summary)
Full step-by-step walkthrough lives in
references/procedure.md. High-level flow:
Resolve active target + open source-of-truth documents (incl.
<carrier-pinmap>,<ref-dtb>,<uphy-state>). Refuse if<uphy-state>is missing.Diff PCIe topology — devkit vs custom carrier — by decompiling
<ref-dtb>and grepping the schematic forPEX<N>_*net labels.AskUserQuestion(multiSelect) — which controllers to customize.Per-controller verification: pinmap + schematic +
pin_verifier.pyforPE<N>_CLKREQ_L,PE<N>_RST_L, optionalPE<N>_WAKE_L.Auto-derive per-controller plan (
enablefrom<uphy-state>,lanes/speedfrom Adaptation Guide,modehard-pinned to"rc") → mandatory confirm-or-customize gate.Append per-controller
fragment@Nblocks (marker/* custom-bsp: pcie:pcie@<addr> */) to the composite custom overlay.dtsinbsp_sources/. Pre-flightdtc+fdtoverlay. Commit via the workflow's preview gate. Do not editODMDATA—/jetson-customize-uphyalready emittedpcie@N_status=…,pcie@N_max-link-speed,pcie@N_pcie-mode,pcie@N_clk-scheme, andpcie-cN-endpoint-enablein its single atomic ODMDATA commit. This skill only translates the per-controller plan into kernel-DT overlay fragments.(Step folded into Step 6 — overlay-only emission.)
Cross-check ODMDATA vs overlay consistency. On a contradictory row, stop and ask the user how to recover the two commits. Never run
git reset --hardautonomously.Write run-state JSON sidecar at
<workspace>/target-platform/<profile-stem>.jetson-customize-pcie.jsonsummary, then drive the downstream next-step chain via sequential
AskUserQuestionprompts perreferences/procedure.mdStep 9. Never substitute a printed "Next step: …" line for the prompts.
Limitations
Mode hard-pinned to RC. Endpoint mode is only emitted when the operator passes
mode_override="ep"in Step 5c.enableis derived, not asked. UPHY-allocated controllers are mandatorilyokay; non-allocated are mandatorilydisabled.No upstream BSP edits. Output lands in
Linux_for_Tegra/+bsp_sources/only.Pre-flight overlay merge is a sanity check, not the production build.
/jetson-build-sourceis authoritative.Flash-conf overlay registration is out of scope. Owned by
/jetson-build-sourceStep 5.0a.
Troubleshooting
<uphy-state>missing → run/jetson-customize-uphyfirst.Slot doesn't enumerate after flash → check
dmesg | grep pcie; re-verify ODMDATApcie@<N>_status=okayand the overlay fragment agree (Step 8 table inreferences/procedure.md).Link trains at wrong width → confirm UPHY config in
<uphy-state>allocates the expected lane count; the kernel fragment'snum-lanesmust match.compatiblemismatch → fix the composite root, not the fragment. UEFI plugin-manager silently skips on mismatch.Contradictory ODMDATA-vs-overlay row → ask the user; do not auto-
git reset --hard. See gotchas.Common pitfalls — see
references/gotchas.md(RC pinning, node- address sourcing, stock-disabled controllers, intra-file handoff withjetson-customize-uphy).
References
references/procedure.md— full nine- step procedure (topology diff, plan derivation, overlay append, ODMDATA cross-check, sidecar).references/gotchas.md— failure modesinvariants (RC pinning, address sourcing, BPMP handoff).
../../scripts/pin_verifier.py— shared HSIO pin verifier (Step 4).../../references/platform_template.yaml—documents:block consumed by Step 1.../../context/bsp-customization-workflow.md— overlay edit protocol + commit message preview gate.../../references/bsp-customization-kernel-dtb.md— composite overlay filename / skeleton / append protocol.../jetson-customize-uphy/SKILL.md— sibling skill that owns UPHY lane allocation; its sidecar drives the per-controllerenabledecision.../jetson-customize-pinmux/SKILL.md— sibling skill invoked by Step 4 (with operator confirmation) to fix HSIO pin SFIO mismatches.../jetson-customize-mgbe/SKILL.md— sibling for MGBE controllers; shares the two-surface (ODMDATAoverlay) pattern.
../jetson-derive-carrier/SKILL.md— must run first; produces the carrier flash-conf fork edited in Step 6.../jetson-init-source/SKILL.md— produces the overlay tracker + bsp_sources repo this skill commits into.
Files
- ATTRIBUTION.mdAdded by AutoGineer926 B
- BENCHMARK.md3.7 KiB
- LICENSELicence file added by AutoGineer11.2 KiB
- SKILL.md9.1 KiB
- evals/evals.json6.9 KiB
- references/gotchas.md2.3 KiB
- references/procedure.md14.8 KiB
- skill-card.md3.7 KiB
- skill.oms.sig4.9 KiB
evals/evals.json
[
{
"id": "jetson-customize-pcie-001",
"question": "/jetson-customize-uphy just switched my Thor carrier from uphy0-config-7 to uphy0-config-6, enabling PCIe C3 with a 4-lane Gen4 slot. Now bring up the per-controller side via /jetson-customize-pcie.",
"expected_skill": "jetson-customize-pcie",
"expected_script": null,
"ground_truth": "Run /jetson-customize-pcie. Step 1 resolves the active target and opens the carrier pinmap, reference DTB and <uphy-state> sidecar — refuse if <uphy-state> is missing — and require both documents.custom_carrier_schematic AND documents.custom_carrier_pinmux_xls when custom_carrier: is present. Step 2 diffs the PCIe topology by decompiling <ref-dtb> and grepping the schematic for PEX<N>_* net labels. Step 3 issues an AskUserQuestion (multiSelect) for which controllers to customize. Step 4 runs pin_verifier.py for PE<N>_CLKREQ_L, PE<N>_RST_L and optional PE<N>_WAKE_L; mismatches route (with operator confirmation) to /jetson-customize-pinmux. Step 5 auto-derives the per-controller plan: enable from <uphy-state> (mandatorily okay for UPHY-allocated, mandatorily disabled otherwise), lanes/speed from the Adaptation Guide, mode hard-pinned to 'rc' (only emit 'ep' when the operator passes mode_override='ep'), then runs the confirm-or-customize gate. Step 6 appends per-controller fragment@N blocks marked /* custom-bsp: pcie:pcie@<addr> */ into the composite custom overlay .dts in bsp_sources/ per references/bsp-customization-kernel-dtb.md, runs the dtc + fdtoverlay pre-flight and commits via the workflow's preview gate. The skill MUST NOT edit ODMDATA — pcie@N_status=…, pcie@N_max-link-speed, pcie@N_pcie-mode, pcie@N_clk-scheme and pcie-cN-endpoint-enable are owned by /jetson-customize-uphy in its single atomic ODMDATA commit. Step 8 cross-checks ODMDATA vs overlay consistency and on contradiction stops to ask the user — never running 'git reset --hard' autonomously. Step 9 writes <profile-stem>.jetson-customize-pcie.json and drives the downstream next-step chain via sequential AskUserQuestion prompts. /jetson-build-source compiles the composite .dtbo and owns OVERLAY_DTB_FILE+= registration.",
"expected_behavior": [
"Read skills/jetson-customize-pcie/SKILL.md",
"Step 1: validate active profile with reference_devkit + custom_carrier and refuse if <uphy-state> at <workspace>/target-platform/<profile-stem>.jetson-customize-uphy.json is missing; require both documents.custom_carrier_schematic and documents.custom_carrier_pinmux_xls",
"Step 2: diff PCIe topology — devkit vs custom carrier — by decompiling <ref-dtb> and grepping the schematic for PEX<N>_* net labels",
"Step 3: AskUserQuestion (multiSelect) for which controllers to customize",
"Step 4: run pin_verifier.py for PE<N>_CLKREQ_L, PE<N>_RST_L and optional PE<N>_WAKE_L; route mismatches (with operator confirmation) to /jetson-customize-pinmux",
"Step 5: derive per-controller plan from <uphy-state> (UPHY-allocated => okay, non-allocated => disabled), pull lanes/speed from the Adaptation Guide, hard-pin mode to 'rc' (only 'ep' on explicit mode_override), then run the confirm-or-customize gate",
"Step 6: append per-controller fragment@N blocks marked /* custom-bsp: pcie:pcie@<addr> */ into the composite custom overlay .dts in bsp_sources/, run dtc + fdtoverlay pre-flight and commit via the preview gate",
"Do NOT edit ODMDATA — pcie@N_status, pcie@N_max-link-speed, pcie@N_pcie-mode, pcie@N_clk-scheme and pcie-cN-endpoint-enable are owned by /jetson-customize-uphy",
"Step 8: cross-check ODMDATA vs overlay consistency; on contradiction stop and ask the operator, never run 'git reset --hard' autonomously",
"Step 9: write <workspace>/target-platform/<profile-stem>.jetson-customize-pcie.json and drive the downstream chain via sequential AskUserQuestion prompts; hand off to /jetson-build-source for composite .dtbo compilation and OVERLAY_DTB_FILE+= registration"
]
},
{
"id": "jetson-customize-pcie-002",
"question": "After /jetson-customize-pcie my PCIe slot enumerates but the link trains at x2 instead of the expected x4, and dmesg shows pcie controller link timeouts on a controller I thought I disabled. What's going on?",
"expected_skill": "jetson-customize-pcie",
"expected_script": null,
"ground_truth": "Two-surface mismatch. Each PCIe controller's runtime behavior is determined by both ODMDATA (BPMP DTB /pcie/pcie@N: UPHY lane power, refclk gating, controller-side rails) and the kernel-DT overlay on &pcieN (kernel probe, lane width, link speed, RC/EP mode); skipping the kernel overlay on a disable lets the kernel probe a powered-down PHY (the link timeouts you see in dmesg), and skipping the ODMDATA token on a disable leaves BPMP holding the PHY hot. For the x2-instead-of-x4 case, confirm /jetson-customize-uphy's <uphy-state> sidecar allocates the expected lane count for that controller — the kernel fragment's num-lanes must match. For the link timeouts, ensure the kernel-DT overlay fragment for the disabled controller is present (status=\"disabled\") in the composite custom overlay .dts; do not rely on ODMDATA alone. Run Step 8's ODMDATA-vs-overlay consistency cross-check; on a contradictory row STOP and ask the user how to recover the two commits — never run 'git reset --hard' autonomously. Also check the composite overlay root compatible — UEFI plugin-manager silently skips on mismatch; fix the composite root, not the fragment. All edits stay in <source.root_path>/Linux_for_Tegra/ and <source.root_path>/bsp_sources/.",
"expected_behavior": [
"Read skills/jetson-customize-pcie/SKILL.md and consult the Overview two-surface table plus the Troubleshooting list",
"Recognize the two-surface invariant: ODMDATA owns UPHY lane power/refclk/rails on /pcie/pcie@N in BPMP DTB, the kernel-DT overlay on &pcieN owns kernel probe/lane width/link speed/RC-EP mode — both required",
"Diagnose the link timeouts as a missing kernel-DT overlay status=\"disabled\" fragment letting the kernel probe a powered-down PHY",
"Diagnose the x2 vs x4 link-width as <uphy-state>'s allocation not matching the kernel fragment's num-lanes; confirm UPHY config in <uphy-state> allocates the expected lane count and that num-lanes matches",
"Run Step 8's ODMDATA-vs-overlay consistency cross-check; on a contradictory row stop and ask the user how to recover the two commits — never auto-run 'git reset --hard'",
"Sanity-check the composite overlay root compatible (fix the composite root, not the fragment) — UEFI plugin-manager silently skips on mismatch",
"Do NOT edit ODMDATA from this skill (owned by /jetson-customize-uphy); re-run /jetson-customize-uphy if the ODMDATA side needs to change",
"Re-emit the per-controller /* custom-bsp: pcie:pcie@<addr> */ fragments via Step 6 with dtc + fdtoverlay pre-flight, refresh <profile-stem>.jetson-customize-pcie.json and hand off to /jetson-build-source"
]
}
]
Requirements and compatibility
Written for: Claude Code
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Names Claude Code tools, Needs Node.js
Security
What our scanner noticed· Medium risk
- Large base64-encoded blobs
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Jetson Team
- Publisher
- NVIDIA (Official)
- Distributed by
- NVIDIA
- Source
- NVIDIA/skills · skills/jetson-customize-pcie · commit fce3cca
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE-APACHE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Jetson Team or NVIDIA.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download jetson-customize-pcie.zip