Python Enablement Software Description
Architecture Details
OMI enablement platform requires software to configure/synchronize/exercise the host and the DDIMMs modules.
Initial development was performed using IBM's Cronus tool and can still be used if required.
To ease the discovery of OMI technology, a simple python code has been developed.
It can be run either on a external Raspberry pi, or any computer providing an I2C acces to the VCU128 card or on an internal Microblaze microprocessor (under development)
Requirements
- "click" and "smbus2" librairies are required.
- General knowledge of python configuration on chosen hardware/OS as well as I2C skills are required.
- Source code is available here
General Preparation and Settings
This application is run from CLI (Command Line Interface) with Python3:
python3 omi.py --help
For a verbose display of any command, add the --log option just after omi.py
python3 omi.py --log yourcommand
With any command, the I2C bus can be provided with -b option. By default I2C bus is set to 3 if not given.
If you are using a different I2C bus number, the number should be passed like this:
python3 omi.py anycommand -b 1
You can scan the I2C bus with the command:
python3 omi.py scan -b 3
Warning !
Code is provided as is, if unexpected I2C lanes hangs occur, a complete reset of Fire might be required
Adapter card Mux settings
To be able to access a ddimm from I2C, muxes need to be configured:
python3 omi.py initpath -d ddimm # ddimm : I2C selected DDIMM . Can be a,b,none.
python3 omi.py initpath -d a
python3 omi.py initpath -d b
python3 omi.py initpath -d none
At any time, you can check the current path already set up with:
python3 omi.py checkpath
Initialize device
Before using the following functions, use the following command to initialize the host,
without it, i2c errors will be encountered:
python3 omi.py init
Host/device information
To print out information about a chip, just do:
python3 omi.py info -c chip # chip: host/device name. Can be either "fire" or "explorer" (or "ice")
python3 omi.py info -c fire
python3 omi.py info -c explorer
python3 omi.py info -c ice
Reseting Device
Change reset state of a DDIMM or multiple DDIMMs from fire:
python3 omi.py ddimmreset -d ddimms -s newresetstate
ddimms: letters of ddimms selected (Examples: abcdsw, ab, a)
- newresetstate: on to activate reset mode, off to quit reset mode
Example
python3 omi.py ddimmreset -d ab -s on
Read a host/device register:
python3 omi.py read -c chip -r regaddr
-
chip: chip name. Can be either fire or explorer (or ice)
-
regaddr: register address given in hex
python3 omi.py read -c fire -r 0x100000000000004
python3 omi.py read -c explorer -r 0x20b080
python3 omi.py read -c explorer -r 0x8012811
Write to a host/device register:
python3 omi.py write -c chip -r regaddr -d data
- chip: chip name. Can be either fire or explorer (or ice)
- regaddr: register address given in hex
- data: new value to write to the register, in hex
python3 omi.py write -c fire -r 0x100000000000004 -d 0x3f
python3 omi.py write -c explorer -r 0x8012811 -d 0x5000000006f
Trigger training/synchronisation procedure:
python3 omi.py sync -d ddimms
- ddimms: letters of ddimms to sync (Examples: ab, b, a)
!! This function commutes the muxes automatically to sync the ddims provided.
!! Make sure to wait for about 20s after powering/resetting devices before launchig this command,
!! otherwise it fails and needs to be re-executed.
python3 omi.py sync -d a
python3 omi.py sync -d b
python3 omi.py sync -d ab
Trigger DDIMM Configuration procedure:
python3 omi.py ddimmcfg -d ddimms
- ddimms: letters of ddimms to sync (Examples: ab, b, a)
This function will trigger a configuration process with Fire commands (Explorer will be accessed through In-band commands) No need to select the MUX path, as only Fire receives I2C commands.
python3 omi.py ddimmcfg -d a
python3 omi.py ddimmcfg -d b
python3 omi.py ddimmcfg -d ab
To check DDIMM training state:
python3 omi.py checksync -d ddimms
- ddimms: letters of ddimms to sync check (Examples: ab, b, a)
python3 omi.py checksync -d a
python3 omi.py checksync -d b
python3 omi.py checksync -d ab
Examples of Usage
python3 omi.py initpath -d a
python3 omi.py init
python3 omi.py sync -d a
python3 omi.py info -c explorer
python3 omi.py checkpath
pi@raspberrypi:~/python $ python3 omi.py initpath -d a
pi@raspberrypi:~/python $ python3 omi.py init
pi@raspberrypi:~/python $ python3 omi.py sync -d a
---------- : Explorer Initialisation ------------
Explorer Firmware API version: 0x0f Ready
Sync DDIMMA...
---------- Explorer OMI Training Sequence ------------
---------- Fire OMI Training Sequence ------------
DDIMMA sync Reg: 0x8000000000
Training successfully done.
pi@raspberrypi:~/python $ python3 omi.py ddimmcfg -d a
Configuring DDIMMA...
DDIMMA Configuration
Memory Size : 64GB
Vendor : SMART
Memory Size : 64GB
Vendor : SMART
pi@raspberrypi:~/python $ python3 omi.py info -c explorer
FW number of images: 0x2
Partition ID: 0x41
Major (Boot Partion A): 0x8
Minor (Boot Partion A): 0x0
Build patch (Boot Partion A): 0x0
Build number (Boot Partion A): 0x6792a
Build date (Boot Partion A): 0x2222021
Major (Boot Partion B): 0x8
Minor (Boot Partion B): 0x0
Build patch (Boot Partion B): 0x0
Build number (Boot Partion B): 0x6792a
Build date (Boot Partion B): 0x2222021
RAM size (in bytes): 0x40000
Chip version: 0x20600d2
SPI flash ID: 0xbb98
SPI flash sector size: 0x10000
SPI flash size: 0x1000000
Error buffer size: 0x1000
Image index: 0x0
ECID: 0x1000000000000721a6d03b4f8759f0d4ed89300
Entreprise Mode Status: 0x796
Card ID: 0x3e00008
EEPROM data: Reading 0x40c0a8529000800600003080b8000
Memory Size : 32GB