Hi there,
So, Great questions! Here is what is happening with the external flash power, plus why Partition Manager is throwing that specific gap error:
1. Regarding External Flash & Deep Sleep
You can definitely use the external flash without taking a continuous power hit!
When configured properly in Zephyr (CONFIG_PM_DEVICE=y), the NOR flash driver puts the chip into deep power-down mode (typically sub-microamp standby, around 0.1–1 µA on modern SPI NORs like the Puya PY25Q64) whenever the bus is idle. MCUboot only powers it up briefly to stream, verify, and swap image chunks during an actual DFU / OTA update, after which it goes right back to sleep.
The internal-only build variant is usually recommended by Seeed when cost-optimizing bare modules or avoiding external hardware dependencies altogether. If you stay internal, you save a tiny bit of quiescent leakage, but you have to live with the tighter internal partition squeeze.
2. What Partition Manager Means by “Gaps”
In Partition Manager, a gap is simply an unallocated block of memory between statically defined partitions.
When PM is left to place and size the app dynamically, it requires exactly ONE contiguous gap in flash_primary. If it finds zero or more than one, the solver aborts.
Here is why it reported those two:
-
Gap 1 (0xa800 - 0x130000): Because app was left dynamic or stripped out, PM sees an empty slot starting at 0xA800 (right after mcuboot_pad) and ending at 0x130000 where the upper partitions began.
-
Gap 2 (0x1fd000 - 0x1e5000): Notice how the numbers are backwards! flash_primary on the nRF54LM20A is 1,986,560 bytes (exactly 0x1E5000). If a partition (or the default template) has an offset placed at or beyond 0x1FD000 (assuming a full 2 MB flash instead of ~1.89 MB usable non-volatile storage), the partition end overshoots the hardware region. The PM script tries to calculate the remaining space (region_end - partition_start), causes an arithmetic underflow, and prints out that inverted range.
3. How to Fix It
If you want to use the internal layout cleanly, paste this complete, non-overlapping pm_static.yml into your project root.
It defines every partition end-to-end so there are zero gaps, resolves the MCUboot secondary overlap, fits inside the 0x1E5000 flash boundary, and aligns all partitions cleanly:
mcuboot:
address: 0x0
region: flash_primary
size: 0xA000
mcuboot_pad:
address: 0xA000
region: flash_primary
size: 0x800
mcuboot_primary_app:
address: 0xA800
orig_span: &id002
- app
region: flash_primary
size: 0x10D800
span: *id002
app:
address: 0xA800
region: flash_primary
size: 0x10D800
mcuboot_primary:
address: 0xA000
orig_span: &id001
- app
- mcuboot_pad
region: flash_primary
size: 0x10E000
span: *id001
mcuboot_secondary_pad:
address: 0x118000
region: flash_primary
size: 0x800
mcuboot_secondary_app:
address: 0x118800
region: flash_primary
size: 0xBF800
mcuboot_secondary:
address: 0x118000
orig_span: &id003
- mcuboot_secondary_pad
- mcuboot_secondary_app
region: flash_primary
size: 0xC0000
span: *id003
factory_data:
address: 0x1D8000
region: flash_primary
size: 0x1000
settings_storage:
address: 0x1D9000
region: flash_primary
size: 0xC000
(Note: 0x1D9000 + 0xC000 = 0x1E5000, landing right on the hardware limit without overshooting).
Give your build folder a pristine clean (west build -t pristine or wipe the /build folder) so PM regenerates the layout map from scratch, and it will link through cleanly! 
HTH
GL
PJ 