mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-05-30 02:45:20 +00:00
While we hoped to make the headings consistent over time while doing other edits, we should instead just make the squirrels happy and do them all at once or they'll likely never be made consistent. A python script was used to find the headings, and then a call to https://pypi.org/project/titlecase to transform the title. A visual inspection was used to tweak a few unexpected resulting titles. Signed-off-by: David B. Kinder <david.b.kinder@intel.com>
90 lines
3.4 KiB
ReStructuredText
90 lines
3.4 KiB
ReStructuredText
.. _virtio-gpio:
|
|
|
|
Virtio-Gpio
|
|
###########
|
|
|
|
virtio-gpio provides a virtual GPIO controller, which will map part of
|
|
native GPIOs to User VM, User VM can perform GPIO operations through it,
|
|
including setting values, including set/get value, set/get direction and
|
|
set configuration (only Open Source and Open Drain types are currently
|
|
supported). GPIOs quite often be used as IRQs, typically for wakeup
|
|
events, virtio-gpio supports level and edge interrupt trigger modes.
|
|
|
|
The virtio-gpio architecture is shown below
|
|
|
|
.. figure:: images/virtio-gpio-1.png
|
|
:align: center
|
|
:name: virtio-gpio-1
|
|
|
|
Virtio-gpio Architecture
|
|
|
|
Virtio-gpio is implemented as a virtio legacy device in the ACRN device
|
|
model (DM), and is registered as a PCI virtio device to the guest OS. No
|
|
changes are required in the frontend Linux virtio-gpio except that the
|
|
guest (User VM) kernel should be built with ``CONFIG_VIRTIO_GPIO=y``.
|
|
|
|
There are three virtqueues used between FE and BE, one for gpio
|
|
operations, one for IRQ request and one for IRQ event notification.
|
|
|
|
Virtio-gpio FE driver will register a gpiochip and irqchip when it is
|
|
probed, the base and number of gpio are generated by the BE. Each
|
|
gpiochip or irqchip operation(e.g. get_direction of gpiochip or
|
|
irq_set_type of irqchip) will trigger a virtqueue_kick on its own
|
|
virtqueue. If some gpio has been set to interrupt mode, the interrupt
|
|
events will be handled within the IRQ virtqueue callback.
|
|
|
|
GPIO Mapping
|
|
************
|
|
|
|
.. figure:: images/virtio-gpio-2.png
|
|
:align: center
|
|
:name: virtio-gpio-2
|
|
|
|
GPIO mapping
|
|
|
|
- Each User VM has only one GPIO chip instance, its number of GPIO is
|
|
based on acrn-dm command line and GPIO base always start from 0.
|
|
|
|
- Each GPIO is exclusive, User VM can't map the same native gpio.
|
|
|
|
- Each acrn-dm maximum number of GPIO is 64.
|
|
|
|
Usage
|
|
*****
|
|
|
|
Add the following parameters into the command line::
|
|
|
|
-s <slot>,virtio-gpio,<@controller_name{offset|name[=mapping_name]:offset|name[=mapping_name]:...}@controller_name{...}...]>
|
|
|
|
- **controller_name**: Input ``ls /sys/bus/gpio/devices`` to check native
|
|
gpio controller information. Usually, the devices represent the
|
|
controller_name, you can use it as controller_name directly. You can
|
|
also input ``cat /sys/bus/gpio/device/XXX/dev`` to get device id that can
|
|
be used to match /dev/XXX, then use XXX as the controller_name. On MRB
|
|
and Intel NUC platforms, the controller_name are gpiochip0, gpiochip1,
|
|
gpiochip2.gpiochip3.
|
|
|
|
- **offset|name**: you can use gpio offset or its name to locate one
|
|
native gpio within the gpio controller.
|
|
|
|
- **mapping_name**: This is optional, if you want to use a customized
|
|
name for a FE gpio, you can set a new name for a FE virtual gpio.
|
|
|
|
Example
|
|
*******
|
|
|
|
- Map three native gpio to User VM, they are native gpiochip0 with
|
|
offset of 1 and 6, and with the name ``reset``. In User VM, the three
|
|
gpio has no name, and base from 0.::
|
|
|
|
-s 10,virtio-gpio,@gpiochip0{1:6:reset}
|
|
|
|
- Map four native gpio to User VM, native gpiochip0's gpio with offset 1
|
|
and offset 6 map to FE virtual gpio with offset 0 and offset 1
|
|
without names, native gpiochip0's gpio with name ``reset`` maps to FE
|
|
virtual gpio with offset 2 and its name is ``shutdown``, native
|
|
gpiochip1's gpio with offset 0 maps to FE virtual gpio with offset 3 and
|
|
its name is ``reset`` ::
|
|
|
|
-s 10,virtio-gpio,@gpiochip0{1:6:reset=shutdown}@gpiochip1{0=reset}
|