cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

slave-testunit-backend.rst (3862B)


      1.. SPDX-License-Identifier: GPL-2.0
      2
      3================================
      4Linux I2C slave testunit backend
      5================================
      6
      7by Wolfram Sang <wsa@sang-engineering.com> in 2020
      8
      9This backend can be used to trigger test cases for I2C bus masters which
     10require a remote device with certain capabilities (and which are usually not so
     11easy to obtain). Examples include multi-master testing, and SMBus Host Notify
     12testing. For some tests, the I2C slave controller must be able to switch
     13between master and slave mode because it needs to send data, too.
     14
     15Note that this is a device for testing and debugging. It should not be enabled
     16in a production build. And while there is some versioning and we try hard to
     17keep backward compatibility, there is no stable ABI guaranteed!
     18
     19Instantiating the device is regular. Example for bus 0, address 0x30:
     20
     21# echo "slave-testunit 0x1030" > /sys/bus/i2c/devices/i2c-0/new_device
     22
     23After that, you will have a write-only device listening. Reads will just return
     24an 8-bit version number of the testunit. When writing, the device consists of 4
     258-bit registers and, except for some "partial" commands, all registers must be
     26written to start a testcase, i.e. you usually write 4 bytes to the device. The
     27registers are:
     28
     290x00 CMD   - which test to trigger
     300x01 DATAL - configuration byte 1 for the test
     310x02 DATAH - configuration byte 2 for the test
     320x03 DELAY - delay in n * 10ms until test is started
     33
     34Using 'i2cset' from the i2c-tools package, the generic command looks like:
     35
     36# i2cset -y <bus_num> <testunit_address> <CMD> <DATAL> <DATAH> <DELAY> i
     37
     38DELAY is a generic parameter which will delay the execution of the test in CMD.
     39While a command is running (including the delay), new commands will not be
     40acknowledged. You need to wait until the old one is completed.
     41
     42The commands are described in the following section. An invalid command will
     43result in the transfer not being acknowledged.
     44
     45Commands
     46--------
     47
     480x00 NOOP (reserved for future use)
     49
     500x01 READ_BYTES (also needs master mode)
     51   DATAL - address to read data from (lower 7 bits, highest bit currently unused)
     52   DATAH - number of bytes to read
     53
     54This is useful to test if your bus master driver is handling multi-master
     55correctly. You can trigger the testunit to read bytes from another device on
     56the bus. If the bus master under test also wants to access the bus at the same
     57time, the bus will be busy. Example to read 128 bytes from device 0x50 after
     5850ms of delay:
     59
     60# i2cset -y 0 0x30 0x01 0x50 0x80 0x05 i
     61
     620x02 SMBUS_HOST_NOTIFY (also needs master mode)
     63   DATAL - low byte of the status word to send
     64   DATAH - high byte of the status word to send
     65
     66This test will send an SMBUS_HOST_NOTIFY message to the host. Note that the
     67status word is currently ignored in the Linux Kernel. Example to send a
     68notification after 10ms:
     69
     70# i2cset -y 0 0x30 0x02 0x42 0x64 0x01 i
     71
     720x03 SMBUS_BLOCK_PROC_CALL (partial command)
     73   DATAL - must be '1', i.e. one further byte will be written
     74   DATAH - number of bytes to be sent back
     75   DELAY - not applicable, partial command!
     76
     77This test will respond to a block process call as defined by the SMBus
     78specification. The one data byte written specifies how many bytes will be sent
     79back in the following read transfer. Note that in this read transfer, the
     80testunit will prefix the length of the bytes to follow. So, if your host bus
     81driver emulates SMBus calls like the majority does, it needs to support the
     82I2C_M_RECV_LEN flag of an i2c_msg. This is a good testcase for it. The returned
     83data consists of the length first, and then of an array of bytes from length-1
     84to 0. Here is an example which emulates i2c_smbus_block_process_call() using
     85i2ctransfer (you need i2c-tools v4.2 or later):
     86
     87# i2ctransfer -y 0 w3@0x30 0x03 0x01 0x10 r?
     880x10 0x0f 0x0e 0x0d 0x0c 0x0b 0x0a 0x09 0x08 0x07 0x06 0x05 0x04 0x03 0x02 0x01 0x00