vhost-device/vhost-device-i2c
Davíð Steinn Geirsson 1c021aaea6 Use our vhost fork for all crates and add GPU flake package
Use our vhost fork for all crates. It has SHMEM and GPU backend support.
Add a Nix flake package for vhost-device-gpu with the virgl backend enabled.

Also fixes duplicate imports in vhost-device-gpu/src/backend/virgl.rs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 19:10:55 +00:00
..
src chore: remove pub visibility from exit event fields 2025-11-19 12:09:37 +02:00
Cargo.toml Use our vhost fork for all crates and add GPU flake package 2026-03-22 19:10:55 +00:00
CHANGELOG.md chore: standardize changelogs 2024-07-24 19:37:19 +05:30
LICENSE-APACHE Move all crates to workspace root 2023-10-16 12:03:57 +05:30
LICENSE-BSD-3-Clause Move all crates to workspace root 2023-10-16 12:03:57 +05:30
README.md i2c: fix minor typos 2025-07-07 11:28:02 +03:00

vhost-device-i2c - I2C emulation backend daemon

Description

This program is a vhost-user backend that emulates a VirtIO I2C bus. This program takes the layout of the i2c bus and its devices on the host OS and then talks to them via the /dev/i2c-X interface when a request comes from the guest OS for an I2C or SMBUS device.

This program is tested with QEMU's -device vhost-user-i2c-pci but should work with any virtual machine monitor (VMM) that supports vhost-user. See the Examples section below.

Synopsis

vhost-device-i2c [OPTIONS]

Options

.. program:: vhost-device-i2c

.. option:: -h, --help

Print help.

.. option:: -s, --socket-path=PATH

Location of vhost-user Unix domain sockets, this path will be suffixed with 0,1,2..socket_count-1.

.. option:: -c, --socket-count=INT

Number of guests (sockets) to attach to, default set to 1.

.. option:: -l, --device-list=I2C-DEVICES

I2c device list at the host OS can be in two different format, name and number:

  • format by name: <bus-name>:<client_addr>[:<client_addr>],[<bus-name>:<client_addr>[:<client_addr>]]
      Example: --device-list "i915 gmbus dpd:32:21,DPDDC-D:10:23"

Here, bus-name: is adapter's name. e.g. value of /sys/bus/i2c/devices/i2c-0/name. client_addr (decimal): address for client device, 32 == 0x20.

  • format by number: <bus>:<client_addr>[:<client_addr>],[<bus>:<client_addr>[:<client_addr>]]
      Example: --device-list "2:32:21,3:10:23"

Here, bus (decimal): adapter bus number. e.g. 2 for /dev/i2c-2, 3 for /dev/i2c-3. client_addr (decimal): address for client device, 32 == 0x20.

Examples

The daemon should be started first:

::

host# vhost-device-i2c --socket-path=vi2c.sock --socket-count=1 --device-list "i915 gmbus dpd:32"

host# vhost-device-i2c --socket-path=vi2c.sock --socket-count=1 --device-list "0:32"

The QEMU invocation needs to create a chardev socket the device can use to communicate as well as share the guests memory over a memfd.

::

host# qemu-system
-chardev socket,path=vi2c.sock,id=vi2c
-device vhost-user-i2c-pci,chardev=vi2c,id=i2c
-m 4096
-object memory-backend-file,id=mem,size=4G,mem-path=/dev/shm,share=on
-numa node,memdev=mem
...

License

This project is licensed under either of