Customize MGBE / 25G QSFP
Overview
Thor T264 exposes mgbe0..mgbe3. On a custom carrier, the 25G QSFP cage
(or 10G / 1G fiber path) is wired to one of them through SerDes — with
or without an external MDIO PHY in front of the cage. This skill
renders the kernel-DT overlay that pairs the BPMP allocation with
kernel-side status="okay" + PHY plumbing on &mgbeN.
Out of scope:
- UPHY lane allocation — owned by
/jetson-customize-uphy. Refuse if
the chosen uphy1-config-N doesn't allocate the target MGBE.
- All ODMDATA tokens (
mgbeN-speed-*, sub-node mgbeN_status=*) —
owned by /jetson-customize-uphy in its single atomic ODMDATA
commit. This skill MUST NOT touch ODMDATA=.
Output is one commit to the composite custom overlay .dts in the
bsp_sources/ hardware repo. /jetson-build-source compiles the
composite to .dtbo and owns its Makefile + flash-conf registration.
When to invoke
- The user says "enable 25G", "configure QSFP", "set MGBE PHY mode",
"wire MGBE to QSFP", or asks to bring up a 10G / 1G fiber path.
- Cold boot succeeds but
ip link show mgbe<N> reports state DOWN
or NO-CARRIER on the configured controller, OR the controller
never appears at all.
jetson-customize-uphy ran with uphy1-config-8 (or another config
allocating MGBE) and you now need to bring up the per-controller
side.
Prerequisites:
- Active profile selected with
reference_devkit: (Thor) +
custom_carrier: blocks.
<source.root_path>/Linux_for_Tegra/.git exists
(/jetson-init-source).
/jetson-derive-carrier has run — carrier flash-conf fork is in
the overlay tracker.
/jetson-customize-uphy chose a UPHY config that allocates the target
MGBE controller's lanes (uphy1-config-8 on Thor for MGBE0..3 25G).
- Source-of-truth docs registered or supplied at prompt:
Adaptation Guide, Module Design Guide, SoC TRM.
- When
custom_carrier: is present, both
documents.custom_carrier_schematic AND
documents.custom_carrier_pinmux_xls are REQUIRED. Refuse the run
if either is missing — MGBE routing on a custom carrier cannot be
guessed. Reference-devkit-only profiles skip this check.
dtc on PATH.
Procedure
See references/procedure.md for the full step-by-step procedure (Steps 1–8). Summary:
- Resolve active target + documents. Validate active profile, custom_carrier, overlay tracker; locate the relevant Adaptation Guide chapter and pinmap.
- Per-controller question loop. AskUserQuestion driven by
questions.json (controller, phy_mode, attach kind, I²C bus/addr, reset GPIO, compatible_list).
- Derive max-speed from phy_mode. Decompile the BPMP DTB to pick sub-node vs top-level token grammar; cite the inspection in notes.
- Verify HSIO pins + auto-fix. Run
pin_verifier.py for MDC/MDIO/RESET/INT; surface mismatches and route to /jetson-customize-pinmux.
- (no ODMDATA edits.) MGBE ODMDATA tokens are emitted by
/jetson-customize-uphy. Step 5 only records the BPMP DTB token-form inspection (sub-node vs top-level) in notes[] for audit.
- Append composite-overlay fragments. Write one fragment per controller into the composite custom overlay
.dts; obey the /* custom-bsp: mgbe:mgbe... */ marker contract; run the cpp/dtc/fdtoverlay pre-flight.
- (Reserved.) Sibling-skill ordering / cross-cutting validation.
- Run-state sidecar + summary + next-step chain. Write
<profile-stem>.jetson-customize-mgbe.json and emit the one-line + table summary, then drive the downstream chain via sequential AskUserQuestion prompts per references/procedure.md Step 8. Never substitute a printed "Next step: …" line for the prompts.
Gotchas
- Stock Thor BPMP DTB has no
/mgbe/mgbe@N subtree — only
mgbe<N>-speed under /uphy. The mgbe<N>_status=disabled
sub-node token is silently rejected on these releases; the whole
ODMDATA line is then dropped at flash time. Always decompile BPMP
DTB (Step 3) before emitting; use the top-level dashed form
(mgbe<N>-speed-del to remove, mgbe<N>-speed-25G to set) when
the sub-node isn't there. Same wrong-form failure surface as
jetson-customize-uphy.
mdio child needs both #address-cells = <1> AND
#size-cells = <0> when phy_attach_kind=="phy". Missing either
→ kernel rejects phy@<addr> reg property at probe; MGBE never
comes up.
- Overlay root
compatible must intersect live DT compatible.
UEFI plugin-manager filters by compatible match. A mismatched
overlay is silently skipped — flash succeeds, MGBE stays disabled,
no error in dmesg. Always sanity-check against
/proc/device-tree/compatible on a booted reference DUT.
OVERLAY_DTB_FILE ordering is jetson-build-source's problem,
not this skill's. This skill never touches the carrier flash
conf. The composite custom overlay is registered (by
/jetson-build-source Step 5.0a) AFTER the platform
*-dynamic.dtbo, which is the correct ordering. If you find
yourself appending OVERLAY_DTB_FILE+= in this skill, you're
duplicating ownership — stop, and let the build skill do it.
- UPHY lane allocation is
jetson-customize-uphy's job. If the chosen
uphy1-config-N doesn't allocate lanes for the target MGBE
controller, BL31 SError (fmon_update_config: detected fault 0x80) on cold boot. Always run /jetson-customize-uphy first; cite the
chosen uphy1-config-N in this skill's run-summary notes[].
- Don't disable a stock-okay controller via ODMDATA alone. Same
rule as
jetson-customize-uphy: mgbe<N>_status=disabled for a
controller that's already disabled in BPMP DTB is a no-op the
parser may treat as ambiguous → drops the rest of the ODMDATA
line. Disable via the kernel-DT overlay (status="disabled") only.
- Don't touch the upstream BSP at
<bsp_image.root_path>. All
edits land in the overlay tracker / bsp_sources mono-repo under
the pristine + customization commit pattern.
- JSON sidecar is structured state, not authoritative. Same
caveat as
jetson-customize-uphy: ODMDATA + overlay .dts + two git
commits are the device-facing outputs; the sidecar is for tooling
and idempotency only.
References
1---2name: jetson-customize-mgbe3description: Enable Jetson Thor 25G/10G/1G MGBE QSFP via kernel-DT overlay. Do NOT use for UPHY lane allocation or ODMDATA edits.4license: Apache-2.05---67# Customize MGBE / 25G QSFP89## Overview1011Thor T264 exposes mgbe0..mgbe3. On a custom carrier, the 25G QSFP cage12(or 10G / 1G fiber path) is wired to one of them through SerDes — with13or without an external MDIO PHY in front of the cage. This skill14renders the kernel-DT overlay that pairs the BPMP allocation with15kernel-side `status="okay"` + PHY plumbing on `&mgbeN`.1617**Out of scope:**18- UPHY lane allocation — owned by `/jetson-customize-uphy`. Refuse if19 the chosen `uphy1-config-N` doesn't allocate the target MGBE.20- All ODMDATA tokens (`mgbeN-speed-*`, sub-node `mgbeN_status=*`) —21 owned by `/jetson-customize-uphy` in its single atomic ODMDATA22 commit. This skill MUST NOT touch `ODMDATA=`.2324Output is **one commit** to the composite custom overlay `.dts` in the25`bsp_sources/` hardware repo. `/jetson-build-source` compiles the26composite to `.dtbo` and owns its Makefile + flash-conf registration.2728## When to invoke2930- The user says "enable 25G", "configure QSFP", "set MGBE PHY mode",31 "wire MGBE to QSFP", or asks to bring up a 10G / 1G fiber path.32- Cold boot succeeds but `ip link show mgbe<N>` reports `state DOWN`33 or `NO-CARRIER` on the configured controller, OR the controller34 never appears at all.35- `jetson-customize-uphy` ran with `uphy1-config-8` (or another config36 allocating MGBE) and you now need to bring up the per-controller37 side.3839**Prerequisites:**4041- Active profile selected with `reference_devkit:` (Thor) +42 `custom_carrier:` blocks.43- `<source.root_path>/Linux_for_Tegra/.git` exists44 (`/jetson-init-source`).45- `/jetson-derive-carrier` has run — carrier flash-conf fork is in46 the overlay tracker.47- `/jetson-customize-uphy` chose a UPHY config that allocates the target48 MGBE controller's lanes (`uphy1-config-8` on Thor for MGBE0..3 25G).49- Source-of-truth docs registered or supplied at prompt:50 Adaptation Guide, Module Design Guide, SoC TRM.51- **When `custom_carrier:` is present, both52 `documents.custom_carrier_schematic` AND53 `documents.custom_carrier_pinmux_xls` are REQUIRED.** Refuse the run54 if either is missing — MGBE routing on a custom carrier cannot be55 guessed. Reference-devkit-only profiles skip this check.56- `dtc` on PATH.5758## Procedure5960See `references/procedure.md` for the full step-by-step procedure (Steps 1–8). Summary:61621. **Resolve active target + documents.** Validate active profile, custom_carrier, overlay tracker; locate the relevant Adaptation Guide chapter and pinmap.632. **Per-controller question loop.** AskUserQuestion driven by `questions.json` (controller, phy_mode, attach kind, I²C bus/addr, reset GPIO, compatible_list).643. **Derive max-speed from phy_mode.** Decompile the BPMP DTB to pick sub-node vs top-level token grammar; cite the inspection in notes.654. **Verify HSIO pins + auto-fix.** Run `pin_verifier.py` for MDC/MDIO/RESET/INT; surface mismatches and route to `/jetson-customize-pinmux`.665. **(no ODMDATA edits.)** MGBE ODMDATA tokens are emitted by `/jetson-customize-uphy`. Step 5 only records the BPMP DTB token-form inspection (sub-node vs top-level) in `notes[]` for audit.676. **Append composite-overlay fragments.** Write one fragment per controller into the composite custom overlay `.dts`; obey the `/* custom-bsp: mgbe:mgbe... */` marker contract; run the cpp/dtc/fdtoverlay pre-flight.687. **(Reserved.)** Sibling-skill ordering / cross-cutting validation.698. **Run-state sidecar + summary + next-step chain.** Write `<profile-stem>.jetson-customize-mgbe.json` and emit the one-line + table summary, then drive the downstream chain via sequential `AskUserQuestion` prompts per `references/procedure.md` Step 8. Never substitute a printed "Next step: …" line for the prompts.7071## Gotchas7273- **Stock Thor BPMP DTB has no `/mgbe/mgbe@N` subtree** — only74 `mgbe<N>-speed` under `/uphy`. The `mgbe<N>_status=disabled`75 sub-node token is silently rejected on these releases; the whole76 ODMDATA line is then dropped at flash time. Always decompile BPMP77 DTB (Step 3) before emitting; use the top-level dashed form78 (`mgbe<N>-speed-del` to remove, `mgbe<N>-speed-25G` to set) when79 the sub-node isn't there. Same wrong-form failure surface as80 `jetson-customize-uphy`.81- **`mdio` child needs both `#address-cells = <1>` AND82 `#size-cells = <0>`** when `phy_attach_kind=="phy"`. Missing either83 → kernel rejects `phy@<addr>` reg property at probe; MGBE never84 comes up.85- **Overlay root `compatible` must intersect live DT compatible.**86 UEFI plugin-manager filters by compatible match. A mismatched87 overlay is silently skipped — flash succeeds, MGBE stays disabled,88 no error in dmesg. Always sanity-check against89 `/proc/device-tree/compatible` on a booted reference DUT.90- **`OVERLAY_DTB_FILE` ordering is `jetson-build-source`'s problem,91 not this skill's.** This skill never touches the carrier flash92 conf. The composite custom overlay is registered (by93 `/jetson-build-source` Step 5.0a) AFTER the platform94 `*-dynamic.dtbo`, which is the correct ordering. If you find95 yourself appending `OVERLAY_DTB_FILE+=` in this skill, you're96 duplicating ownership — stop, and let the build skill do it.97- **UPHY lane allocation is `jetson-customize-uphy`'s job.** If the chosen98 `uphy1-config-N` doesn't allocate lanes for the target MGBE99 controller, BL31 SError (`fmon_update_config: detected fault100 0x80`) on cold boot. Always run `/jetson-customize-uphy` first; cite the101 chosen `uphy1-config-N` in this skill's run-summary `notes[]`.102- **Don't disable a stock-okay controller via ODMDATA alone.** Same103 rule as `jetson-customize-uphy`: `mgbe<N>_status=disabled` for a104 controller that's already disabled in BPMP DTB is a no-op the105 parser may treat as ambiguous → drops the rest of the ODMDATA106 line. Disable via the kernel-DT overlay (`status="disabled"`) only.107- **Don't touch the upstream BSP at `<bsp_image.root_path>`.** All108 edits land in the overlay tracker / `bsp_sources` mono-repo under109 the pristine + customization commit pattern.110- **JSON sidecar is structured state, not authoritative.** Same111 caveat as `jetson-customize-uphy`: ODMDATA + overlay `.dts` + two git112 commits are the device-facing outputs; the sidecar is for tooling113 and idempotency only.114115## References116117- [`questions.json`](references/questions.json) — Q-1..Q-8 prompt schema118 consumed by Step 2.119- [`../../scripts/pin_verifier.py`](../../scripts/pin_verifier.py)120 — shared HSIO pin verifier (Step 4).121- [`../../references/platform_template.yaml`](../../references/platform_template.yaml)122 — `documents:` block consumed by Step 1.123- [`../../context/bsp-customization-workflow.md`](../../context/bsp-customization-workflow.md#commit-batching-in-the-overlay-tracker)124 — overlay edit protocol (batched pristine + customization commit).125- [`../jetson-customize-uphy/SKILL.md`](../jetson-customize-uphy/SKILL.md) — sibling126 skill that owns UPHY lane allocation. Must run before this skill to127 set `uphy1-config-N` for MGBE-allocated configurations.128- [`../jetson-customize-pinmux/SKILL.md`](../jetson-customize-pinmux/SKILL.md) —129 sibling skill invoked by Step 4 (with operator confirmation) to130 fix pin SFIO mismatches.131- [`../jetson-derive-carrier/SKILL.md`](../jetson-derive-carrier/SKILL.md)132 — must run first; produces the carrier flash-conf fork edited in133 Step 5 and the carrier base overlay this skill orders after.134- [`../jetson-init-source/SKILL.md`](../jetson-init-source/SKILL.md) —135 produces the overlay tracker + bsp_sources repo this skill commits136 into.