Releases: derfsss/AmigaNVMeDevice
nvme.device 1.68 (beta)
Beta release of nvme.device — native NVMe block device driver for AmigaOS 4.1 Final Edition.
⚠️ Beta — actively under development. Validated end-to-end under QEMU (Pegasos2, SAM460ex, AmigaOne, including boot-from-NVMe). On real hardware the practical targets are the AmigaOne X1000 and X5000 — the only models with a free PCIe slot for an NVMe drive (via an M.2 adapter card); confirmation on them is pending. Use at your own risk.
Highlights of 1.68
- Code-review hardening: held-request handling in
TD_ADDCHANGEINT/TD_REMOVE, explicit 16-bit NLB ceiling on the submit path - New AmigaOS Installation Utility wizard (
install.py— double-click its icon): choose between a standard install toDEVS:or a Kickstart-module install (boot from NVMe) with automatic Kicklayout update - 67/67 automated QEMU checks (base, multi-controller, SAM460ex, no-device)
Install: extract nvme.lha, open the nvme drawer, double-click install.py. Full details in the bundled nvme.readme.
See docs/history.md for the complete changelog.
nvme.device 1.66
nvme.device 1.66 — 2026-04-12
Feature-completeness release. Four new SCSI sub-commands added to HD_SCSICMD, driven by an integration survey of blockdev.library and what SAT-aware tools actually call. Includes the first NVMe TRIM implementation in the Amiga ecosystem.
What's new
- UNMAP (CDB 0x42) → NVMe Dataset Management with Deallocate (AD=1). Translates up to 256 16-byte SCSI block descriptors per call into the NVMe DSM range-descriptor format and issues one DSM command. Pre-pinned 4 KiB range buffer per unit. Gated on
ONCS.DSMfrom Identify Controller and on successful buffer allocation; unsupported gracefully with CHECK CONDITION. - READ CAPACITY(16) (CDB 0x9E). 32-byte response with 64-bit last LBA. Future-proofs > 2 TiB namespaces.
- SYNCHRONIZE CACHE(10) (CDB 0x35). Translates to NVMe Flush via the new
NVMeIO_SubmitAndWaitprimitive (sync variant of submit that poll-harvests and suppresses the normal Harvest reply so the SCSI handler can translate status before replying). - MODE SENSE / MODE SELECT page 0x08 (Caching) — CDB 0x1A / 0x5A / 0x15 / 0x55. The WCE bit maps to NVMe Set Features 0x06 (Volatile Write Cache) via new
NVMe_SetFeature/NVMe_GetFeatureadmin wrappers. State tracked on the controller, seeded from Identify byte 525 bit 0.
What's kept from v1.65
All performance wins from the prior sweep are carried forward unchanged:
IExec->CopyMemon the bounce hot path- Alignment-aware bounce vs direct-DMA selection
- Pre-allocated DMAEntry pool per inflight slot
NVMeIO_SubmitNoRing+ event-loop SQ doorbell batching- MDTS soft-cap 2 MiB
- Signal-handshake shutdown, volatile cross-task fields, ATA PASS-THROUGH SMART tab, et al.
Archive contents (nvme.lha)
nvme/
├── AutoInstall (AmiUpdate installer)
├── nvme.device (v1.66 release, 74 204 B)
├── nvme.device.debug (v1.66 debug — rename to install)
├── test_nvme (10-step functional test)
├── nvme_stats (CLI monitor for NSCMD_NVME_GETSTATS)
├── nvme.readme (plain-text end-user docs)
└── diskboot.config.sample (example Kickstart: diskboot.config entry)
nvme.readme (duplicate at archive root for os4depot)
Install
lha x nvme.lha
execute nvme/AutoInstall
For boot-drive use, copy nvme.device into Kickstart: and append nvme.device 1 1 to Kickstart:diskboot.config. Full procedure in docs/nvme_boot_strategy.md.
Tested
- QEMU Pegasos2 end-to-end: boots to DOS / Workbench, partitioned via Media Toolbox, formatted with SFS/00, AmigaDiskBench passes, SMART tab via
HD_SCSICMDATA PASS-THROUGH. - New SCSI sub-commands build clean and dispatch correctly;
blockdev.libraryintegration will exercise them at runtime.
Links
- Session-by-session changelog:
docs/history.md(Session 11 covers v1.66) - Architecture + implementation reference:
docs/architecture.md - Source: https://github.com/derfsss/AmigaNVMeDevice
nvme.device 1.65
nvme.device 1.65 — 2026-04-12
Second-generation performance pass on top of the v1.61 end-to-end-validated baseline.
What's new
IExec->CopyMemon the bounce path. We build-nostartfilesso newlib'smemcpyisn't linked; the previouscompat.cfallback was a byte-by-byte loop. Switching the bounce write/read copy to Exec's optimisedCopyMemis the primary driver of the AmigaDiskBench write wins at 4 KiB – 64 KiB block sizes.- MDTS soft-cap raised 1 MiB → 2 MiB. Controllers that advertise MDTS=0 (unlimited) can now issue single NVMe commands up to 2 MiB — the exact capacity of a single 4 KiB PRP-list page. No change at AmigaDiskBench sizes; latent benefit for filesystem readahead / backup workloads.
- Carries forward the v1.62 structural sweep: alignment-aware bounce selection, pre-allocated DMAEntry pool, split
NVMeIO_SubmitNoRing/NVMeIO_RingSQwith event-loop doorbell batching.
AmigaDiskBench results vs v1.61 baseline
Suite totals (sum across 7 block sizes: 4 KiB, 16 KiB, 32 KiB, 64 KiB, 128 KiB, 256 KiB, 1 MiB), MB/s:
| suite | v1.61 | v1.65 | Δ |
|---|---|---|---|
| HeavyLifter | 442 | 480 | +8.6 % |
| Legacy | 428 | 473 | +10.5 % |
| Sequential | 808 | 792 | −2.1 % |
| Random4K | 1171 | 1299 | +11.0 % |
| SequentialRead | 1377 | 1482 | +7.6 % |
| Random4KRead | 1106 | 1243 | +12.3 % |
| MixedRW70/30 | 1164 | 1277 | +9.7 % |
Highlights:
- Random4K 64 K: 85 → 117 MB/s (+37 %)
- Random4KRead 64 K: 96 → 120 MB/s (+25 %)
- SequentialRead 64 K: 128 → 159 MB/s (+24 %)
- Legacy 1 M: 104 → 114 MB/s (+9 %)
Known regression
Sequential writes at 16–64 KiB block sizes are 5–28 % below v1.61. The direct-DMA path pays a write-side cache flush (dcbf + sync) in StartDMA that's expensive on fresh CPU-dirtied buffer lines — fine for HeavyLifter / Legacy's warm-buffer reuse pattern, but not for Sequential's fresh-buffer pattern. A write-side asymmetric heuristic could recover it; not shipped in this release.
Archive contents (nvme.lha)
Same layout as prior releases:
nvme/
├── AutoInstall
├── nvme.device (v1.65 release, ~72 KB)
├── nvme.device.debug (v1.65 debug — rename to install)
├── test_nvme
├── nvme_stats
├── nvme.readme
└── diskboot.config.sample
nvme.readme (duplicate at archive root for os4depot)
Install
lha x nvme.lha
execute nvme/AutoInstall
For boot-drive use, copy nvme.device into Kickstart: and append nvme.device 1 1 to Kickstart:diskboot.config. Full procedure in docs/nvme_boot_strategy.md.
Links
- Architecture + implementation reference:
docs/architecture.md - Session-by-session changelog:
docs/history.md(Session 10 covers the v1.63–v1.65 design exploration and two dead-ends — unsafe StartDMA pin caching, harmful hybrid-poll under QEMU TCG) - Source: https://github.com/derfsss/AmigaNVMeDevice
nvme.device 1.61
nvme.device 1.61 — 2026-04-12
Native AmigaOS 4.1 Final Edition block-device driver for NVMe controllers on PCIe. Single binary runs on every AmigaOS 4.1 FE platform whose PCIe bridge forwards CPU memory cycles.
Highlights
- Validated end-to-end on QEMU Pegasos2: boots to DOS / Workbench, partitioned via Media Toolbox, formatted with SmartFilesystem (SFS/00), benchmarked with AmigaDiskBench — sustained 265–279 MB/s sequential.
- SMART telemetry visible in AmigaDiskBench's SMART tab via HD_SCSICMD ATA PASS-THROUGH (CDB 0x85 / 0xA1) translation from NVMe Log Page 0x02.
- Multi-controller: up to 4 NVMe devices × 8 namespaces each (32 flat units).
- Boot-drive compatible (resident priority 0, matching virtioscsi.device).
- Release build is silent except for the startup banner on the serial console; debug build ships alongside (rename to swap in).
Supported platforms (one binary, runtime-detected)
| Platform | Host bridge | Status |
|---|---|---|
| QEMU Pegasos2 | MV64361 | Tested end-to-end |
| Pegasos II | MV64361 | Should work |
| Sam440ep | AMCC 440EP | Expected to work |
| Sam460ex | AMCC 460EX | Expected to work |
| X1000 | PA6T Nemo | Expected to work |
| X5000 | QorIQ P5020/P5040 | Expected to work |
| A1222 "Tabor" | QorIQ P1022 | Expected to work |
| AmigaOne 500 | — | Expected to work |
| AmigaOne XE/SE | Mai Logic Articia S | Unsupported — bridge does not forward MMIO; driver aborts cleanly |
Archive contents (nvme.lha)
nvme/
├── AutoInstall (AmiUpdate-ready installer)
├── nvme.device (release build — this is the driver)
├── nvme.device.debug (debug build — full verbose trace, rename to swap in)
├── test_nvme (10-step functional smoke test)
├── nvme_stats (CLI monitor for NSCMD_NVME_GETSTATS)
├── nvme.readme (plain-text end-user docs)
└── diskboot.config.sample (example Kickstart: diskboot.config entry)
nvme.readme (duplicate at archive root for os4depot)
Install
lha x nvme.lha
execute nvme/AutoInstall
For boot-drive use, copy nvme.device into Kickstart: and append nvme.device 1 1 to Kickstart:diskboot.config. See docs/nvme_boot_strategy.md in the source repository for the full procedure (including the QEMU Pegasos2 kickstart.zip layout).
Links
- Full architecture + implementation reference:
docs/architecture.md - Session-by-session changelog:
docs/history.md - Source: https://github.com/derfsss/AmigaNVMeDevice