Flashing SPI ROM Image for Marvell 88SE9345 PCIe SATA Controller

eSATA drives require external power for them to be detected on DRIVE AGX platforms. NVIDIA recommends the following steps:
Connect the DRIVE AGX to the SSD drive using an eSATA to SATA adaptor cable certified for at least SATA II speeds such as https://www.tripplite.com/sata-to-esata-transition-cable-7pin-7pin-18-inch~P95218I. This cable is used for testing at NVIDIA.
Connect external power to the SSD drive either from a SMPS or by connecting a power cable from another desktop PC. NVIDIA only tested eSATA by connecting external SMPS.
Power on the DRIVE AGX platform.
The NVIDIA DRIVE AGX Marvell 88se9345 PCIe – SATA controller connects to any SATA device using the four (4) eSATA ports on board.
The Marvell SATA controller requires a configuration image flashed on an SPI ROM chip to function.
This chapter describes how to flash/update the SPI ROM image used by the SATA controller from the SoC to which SATA controller is assigned.
1. Controller Enumeration
The Marvell SATA controller can be enumerated on either Xavier-A or Xavier-B based on the PCIe switch configuration flashed. Ensure that the SATA controller is enumerated by checking lspci on the Xavier from which SPI ROM image needs to be updated.
nvidia@tegra-ubuntu:~$ lspci | grep RAID
0000:04:00.0 RAID bus controller: Marvell Technology Group Ltd. 88SE9485 SAS/SATA 6Gb/s controller (rev c3)
2. Ensure that memory space access is enabled for the controller:
1. Run lspci -vvv to check the verbose logs of the Marvell SATA controller.
2. Check whether memory space access is disabled (look for string similar to “Region 0/2: Memory” in the lspci -vvv output as bolded below).
RAID bus controller: Marvell Technology Group Ltd. Device 9345 (rev c3)
                Subsystem: Marvell Technology Group Ltd. Device 9480
                Control: I/O- Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
                Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
                Interrupt: pin A routed to IRQ 255
                Region 0: Memory at 39240000 (64-bit, non-prefetchable) [disabled] [size=128K]
                Region 2: Memory at 39200000 (64-bit, non-prefetchable) [disabled] [size=256K]
3. If disabled, then enable using the command:
setpci -s <BDF> COMMAND=0x02
where <BDF> is the Bus:Domain.Function of the RAID controller found in the lspci command output .
nvidia@tegra-ubuntu:~$ lspci | grep RAID
0000:04:00.0 RAID bus controller: Marvell Technology Group Ltd. 88SE9485 SAS/SATA 6Gb/s controller (rev c3)
3. Flashing tool and SPI ROM image availability on targetfs.
Make sure that MLU tool and SPI ROM images are present on targetfs.
Tool path:
Binary SPI ROM image path:

Updating the Image

You must have root privileges to follow the procedures below.
1. Put the "config" file in the directory containing the MLU executable (arm-64):
root@tegra-ubuntu:~# cd /lib/firmware/marvell_sata/bins/88SE9345/tools/MLU-88SE9345-for-Nvidia/arm64-
root@tegra-ubuntu:/lib/firmware/marvell_sata/bins/88SE9345/tools/MLU-88SE9345-for-Nvidia/arm64- cp ../../ConfigFile ./
2. Give the executable permission to MLU tool:
root@tegra-ubuntu:/lib/firmware/marvell_sata/bins/88SE9345/tools/MLU-88SE9345-for-Nvidia/arm64- chmod +x MLU
3. Update the image using the command:
./MLU rflash -a update -f <Binary_SPIROM_image_to_be_flashed>
There may be multiple SPIROM images in the /lib/firmware/marvell_sata/bins/88SE9345/spirom_images/e3550/ directory.
The README file in the directory describes which image file is the latest and what settings are contained in each of the image files. Use the latest SPIROM image as instructed in the README file. The following example uses the first version of SPIROM image.
root@tegra-ubuntu:/lib/firmware/marvell_sata/bins/88SE9345/tools/MLU-88SE9345-for-Nvidia/arm64- ./MLU rflash -a update -f /lib/firmware/marvell_sata/bins/88SE9345/spirom_images/e3550/9345To9485_RAW_MDU1727_AL0002_NoBIOS.BIN
MLU version:, Config file version:
[pci slot 4] find device:9480
find flash chip 1212.
[Update] 0x00000000 - 0x00001000: 0x00000400
[Update] 0x00000000 - 0x00001000: 0x00000800
[Update] 0x00000000 - 0x00001000: 0x00000C00
[Update] 0x0007F000 - 0x00080000: 0x0007FC00
[Update] 0x0007F000 - 0x00080000: 0x00080000
update rawImage successful
More options supported by MLU can be found in MLU utility help.
root@tegra-ubuntu:/lib/firmware/marvell_sata/bins/88SE9345/tools/MLU-88SE9345-for-Nvidia/arm64- ./MLU help
MLU version:, Config file version:
[pci slot 4] find device:9485
find flash chip 1212.
help :Get brief help for all commands.
phytest :Test phy(get an Eye Diagram)of current adapter by the given phy id and phy rate.
bist :BIST Retimed Loopback mode support by given port id and phy rate.
Currently support 0:Gen1/1.5G, 1:Gen2/3G, 2:Gen3/6G.
flash :flash the image file for marvell storage device.
config :config device using "deviceid".TXT (shared with MDU).
rflash :Updata/backup raw image file.