124 lines
4.2 KiB
ReStructuredText
124 lines
4.2 KiB
ReStructuredText
|
.. SPDX-License-Identifier: GPL-2.0+
|
||
|
|
||
|
==============================================================
|
||
|
Linux kernel driver for Compute Engine Virtual Ethernet (gve):
|
||
|
==============================================================
|
||
|
|
||
|
Supported Hardware
|
||
|
===================
|
||
|
The GVE driver binds to a single PCI device id used by the virtual
|
||
|
Ethernet device found in some Compute Engine VMs.
|
||
|
|
||
|
+--------------+----------+---------+
|
||
|
|Field | Value | Comments|
|
||
|
+==============+==========+=========+
|
||
|
|Vendor ID | `0x1AE0` | Google |
|
||
|
+--------------+----------+---------+
|
||
|
|Device ID | `0x0042` | |
|
||
|
+--------------+----------+---------+
|
||
|
|Sub-vendor ID | `0x1AE0` | Google |
|
||
|
+--------------+----------+---------+
|
||
|
|Sub-device ID | `0x0058` | |
|
||
|
+--------------+----------+---------+
|
||
|
|Revision ID | `0x0` | |
|
||
|
+--------------+----------+---------+
|
||
|
|Device Class | `0x200` | Ethernet|
|
||
|
+--------------+----------+---------+
|
||
|
|
||
|
PCI Bars
|
||
|
========
|
||
|
The gVNIC PCI device exposes three 32-bit memory BARS:
|
||
|
- Bar0 - Device configuration and status registers.
|
||
|
- Bar1 - MSI-X vector table
|
||
|
- Bar2 - IRQ, RX and TX doorbells
|
||
|
|
||
|
Device Interactions
|
||
|
===================
|
||
|
The driver interacts with the device in the following ways:
|
||
|
- Registers
|
||
|
- A block of MMIO registers
|
||
|
- See gve_register.h for more detail
|
||
|
- Admin Queue
|
||
|
- See description below
|
||
|
- Reset
|
||
|
- At any time the device can be reset
|
||
|
- Interrupts
|
||
|
- See supported interrupts below
|
||
|
- Transmit and Receive Queues
|
||
|
- See description below
|
||
|
|
||
|
Registers
|
||
|
---------
|
||
|
All registers are MMIO and big endian.
|
||
|
|
||
|
The registers are used for initializing and configuring the device as well as
|
||
|
querying device status in response to management interrupts.
|
||
|
|
||
|
Admin Queue (AQ)
|
||
|
----------------
|
||
|
The Admin Queue is a PAGE_SIZE memory block, treated as an array of AQ
|
||
|
commands, used by the driver to issue commands to the device and set up
|
||
|
resources.The driver and the device maintain a count of how many commands
|
||
|
have been submitted and executed. To issue AQ commands, the driver must do
|
||
|
the following (with proper locking):
|
||
|
|
||
|
1) Copy new commands into next available slots in the AQ array
|
||
|
2) Increment its counter by he number of new commands
|
||
|
3) Write the counter into the GVE_ADMIN_QUEUE_DOORBELL register
|
||
|
4) Poll the ADMIN_QUEUE_EVENT_COUNTER register until it equals
|
||
|
the value written to the doorbell, or until a timeout.
|
||
|
|
||
|
The device will update the status field in each AQ command reported as
|
||
|
executed through the ADMIN_QUEUE_EVENT_COUNTER register.
|
||
|
|
||
|
Device Resets
|
||
|
-------------
|
||
|
A device reset is triggered by writing 0x0 to the AQ PFN register.
|
||
|
This causes the device to release all resources allocated by the
|
||
|
driver, including the AQ itself.
|
||
|
|
||
|
Interrupts
|
||
|
----------
|
||
|
The following interrupts are supported by the driver:
|
||
|
|
||
|
Management Interrupt
|
||
|
~~~~~~~~~~~~~~~~~~~~
|
||
|
The management interrupt is used by the device to tell the driver to
|
||
|
look at the GVE_DEVICE_STATUS register.
|
||
|
|
||
|
The handler for the management irq simply queues the service task in
|
||
|
the workqueue to check the register and acks the irq.
|
||
|
|
||
|
Notification Block Interrupts
|
||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
The notification block interrupts are used to tell the driver to poll
|
||
|
the queues associated with that interrupt.
|
||
|
|
||
|
The handler for these irqs schedule the napi for that block to run
|
||
|
and poll the queues.
|
||
|
|
||
|
Traffic Queues
|
||
|
--------------
|
||
|
gVNIC's queues are composed of a descriptor ring and a buffer and are
|
||
|
assigned to a notification block.
|
||
|
|
||
|
The descriptor rings are power-of-two-sized ring buffers consisting of
|
||
|
fixed-size descriptors. They advance their head pointer using a __be32
|
||
|
doorbell located in Bar2. The tail pointers are advanced by consuming
|
||
|
descriptors in-order and updating a __be32 counter. Both the doorbell
|
||
|
and the counter overflow to zero.
|
||
|
|
||
|
Each queue's buffers must be registered in advance with the device as a
|
||
|
queue page list, and packet data can only be put in those pages.
|
||
|
|
||
|
Transmit
|
||
|
~~~~~~~~
|
||
|
gve maps the buffers for transmit rings into a FIFO and copies the packets
|
||
|
into the FIFO before sending them to the NIC.
|
||
|
|
||
|
Receive
|
||
|
~~~~~~~
|
||
|
The buffers for receive rings are put into a data ring that is the same
|
||
|
length as the descriptor ring and the head and tail pointers advance over
|
||
|
the rings together.
|