C 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 C 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
- "smbus2" librairies are required.
- General knowledge of C configuration on chosen hardware/OS as well as I2C skills are required.
- Source code is available here
Compilation
For example on a raspberry pi :
gcc *.c -o omirpi.out
General Preparation and Settings
./omirpi.out --help
For a verbose display of any command, add the --log option just after omi.py
./omirpi.out --log yourcommand
With any command, the I2C bus must be provided with -b option.
If you are using a different I2C bus number, the number should be passed like this:
./omirpi.out anycommand -b 3
You can scan the I2C bus with the command:
./omirpi.out 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:
./omirpi.out initpath -d ddimm # ddimm : I2C selected DDIMM . Can be a,b,none.
./omirpi.out initpath -d a
./omirpi.out initpath -d b
./omirpi.out initpath -d none
At any time, you can check the current path already set up with:
./omirpi.out checkpath
Initialize device
Before using the following functions, use the following command to initialize the host,
without it, i2c errors will be encountered:
./omirpi.out init
Host/device information
To print out information about a chip, just do:
./omirpi.out info -c chip # chip: host/device name. Can be either "fire" or "explorer" (or "ice")
./omirpi.out info -c fire
./omirpi.out info -c explorer
./omirpi.out info -c ice
Reseting Device
Change reset state of a DDIMM or multiple DDIMMs from fire:
./omirpi.out 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
./omirpi.out ddimmreset -d ab -s on
Read a host/device register:
./omirpi.out read -c chip -r regaddr
-
chip: chip name. Can be either fire or explorer (or ice)
-
regaddr: register address given in hex
./omirpi.out read -c fire -r 0x100000000000004
./omirpi.out read -c explorer -r 0x20b080
./omirpi.out read -c explorer -r 0x8012811
Write to a host/device register:
./omirpi.out 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
./omirpi.out write -c fire -r 0x100000000000004 -d 0x3f
./omirpi.out write -c explorer -r 0x8012811 -d 0x5000000006f
Trigger training/synchronisation procedure:
./omirpi.out 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.
./omirpi.out sync -d a
./omirpi.out sync -d b
./omirpi.out sync -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