7.29.10. Nodebox v3 (nbxv3) CPU Module
The Nodebox v3 (nbxv3) is a COM-HPC Server CPU module built on the
NXP LX2160A (16x Cortex-A72) for baremetal 100GE packet processing with
Class C clock management for telecom applications.
The platform port lives entirely under plat/nxp/soc-lx2160a/nbxv3/
and reuses the shared LX2160A SoC layer. Board-specific behaviour is
kept out of the common soc.c through plat_soc_early_init_hook()
and the weak board hooks.
7.29.10.1. Boot source
Production boot is FlexSPI NOR only (GigaDevice GD55LB02GF, 256 MiB
xSPI NOR, JEDEC C8 60 1C). The console is UART1 at 0x021C0000,
115200 8N1, no flow control. SD / eMMC are not wired.
7.29.10.2. Two BL2 variants
A single source tree produces two BL2 images, selected at build time by
NBXV3_BL2_BOOTSTRAP:
Production XIP BL2 (default,
NBXV3_BL2_BOOTSTRAP=0):.text/.rodataexecute in place from the FlexSPI NOR AHB window, embedded in the PBL at NOR offset0x9000..data/.bss/ stack live in OCRAM. XIP avoids the LX2160A multi-bit-ECC trap on uninitialised OCRAM during the Service Processor’s Block-Copy.Bootstrap BL2 (
NBXV3_BL2_BOOTSTRAP=1): OCRAM-resident, non-XIP. Loaded into OCRAM by a JTAG probe (OpenOCD) while the SoC runs the ROM-fallback RCW; used only for first-time / recovery NOR provisioning.
7.29.10.3. Unified runtime flash bootstrap
Both factory-fresh and provisioned boards run the same BL2. The mode is
decided at runtime by reading DCFG_RCWSR0.MEM_PLL_RAT: a value
below the DDR4-1600 DLL-lock minimum (16) means the Service Processor
fell back to a ROM hard-coded RCW, so the NOR is blank or corrupt and
provisioning is required. Otherwise the production RCW is live and BL2
proceeds normally.
power-on / reset
|
v
+-------------------------+
| Service Processor loads |
| RCW from NOR (or ROM |
| fallback if NOR blank) |
+-------------------------+
|
v
BL2: plat_soc_early_init_hook()
read DCFG_RCWSR0.MEM_PLL_RAT
|
+-----------------------------< MEM_PLL_RAT >= 16 >----------------+
| (production RCW live) |
| MEM_PLL_RAT < 16 |
| (ROM fallback: NOR blank/corrupt) |
v v
====== BOOTSTRAP MODE (JTAG semihosting) ====== ====== PRODUCTION MODE ======
open flash_manifest.json over ARM semihosting bootstrap returns silently
| |
v v
for each manifest region: DDR init (SPD over I2C)
- erase NOR slot |
- stream file from JTAG host -> NOR v
- SHA-256 verify via NOR AHB window load FIP (BL31 + BL33)
| |
v v
SW_RST_REQ -> true POR hand off to BL31 in DRAM
|
+--> board reboots; SP now loads the freshly
written production RCW -> PRODUCTION MODE
The provisioning set is data-driven by flash_manifest.json (resolved
over the JTAG probe’s semihosting stdio), not by C code. The manifest can
stage just the boot ROM’s RCW (PBL), or a full set: PBL + FIP + DDR-FIP +
U-Boot + kernel + ramdisk. Smaller manifests provision faster over the
JTAG semihosting link. The schema is documented in
plat/nxp/soc-lx2160a/nbxv3/MANIFEST.md.
7.29.10.4. RCW build stamp (PBL -> BL2)
The RCW carries no version which prevents the software identification.
On this board, this identification is set into one of the LX2160A DCFG
general-purpose scratch registers, SCRATCHRW13.
The PBI command block embedded in the PBL writes it while the boot
Service Processor processes the RCW, and the DCFG
SCRATCHRW registers survive the hand-off to BL2 (they are cleared
only by a power-on reset).
The 32-bit word is packed, all-BCD:
31 28 27 24 23 16 15 8 7 0
+-------+-------+-------+-------+-------+
|CARRIER| TAG | YY | MM | DD | all BCD
+-------+-------+-------+-------+-------+
CARRIER identifies the carrier board the CPU module is plugged into.
TAG is a fixed marker,
0xBYY / MM / DD are the RCW build date in BCD
The first boot lines based on the RCW shall be some of the following:
NOTICE Iliad nbxv32 RCW v.20260820
NOTICE Iliad nbxv3 (bring-up, no IO) RCW v.20260820
This pairs with the MEM_PLL_RAT probe: that register tells BL2
whether a production RCW is live, while SCRATCHRW13 tells it
which one, and on which carrier.
7.29.10.5. Board policy deviations from the LX2160A reference boards
SMMU bypass is always on. There is no untrusted DMA path on this product; the bypass is a performance decision for the DPAA2 / WRIOP packet path. Reference boards only bypass under secure boot.
POVDD strapped to ground.
TA_PROG_SFPis not software-controllable, so in-system fuse provisioning is not supported; fuses are burned by an external jig.Verbose EA / SError handler dumps ESR / FAR / ELR / SPSR_EL3 for kernel bring-up forensics.
Optional features enabled in the board makefile:
NXP_DDR_DUAL_DIMM_TOLERANT(tolerant SPD compare for two-lot DIMM pairing) andNXP_XSPI_DIAG(FlexSPI JEDEC / SFDP / SR1 probe helpers used by the bootstrap and bring-up diagnostics).
7.29.10.6. Building
The fip_ddr target packs the Synopsys DDR PHY training firmware.
Get it using a NXP clone of ddr-phy-binary repository into the TF-A
root so the default DDR_PHY_BIN_PATH (./ddr-phy-binary/lx2160a)
resolves:
git clone https://github.com/NXP/ddr-phy-binary
Production XIP BL2 + FIP (embedded in the PBL at NOR offset 0x9000):
make PLAT=nbxv3 BOOT_MODE=flexspi_nor RCW=$RCW_BIN BL33=$UBOOT_BIN \
pbl fip fip_ddr
Bootstrap BL2 (build, loaded by OpenOCD into OCRAM, resolves staged images over ARM semihosting):
make PLAT=nbxv3 NBXV3_BL2_BOOTSTRAP=1 BOOT_MODE=semihosting bl2
SUPPORTED_BOOT_MODE is flexspi_nor semihosting.
Copyright (c) 2026, Free Mobile. All rights reserved.