// SPDX-License-Identifier: GPL-2.0-only
#include <unistd.h>
#include <errno.h>
#include <stdint.h>
#include <linux/io.h>
#include <linux/pci_regs.h>
#include <linux/pci_ids.h>
#include <linux/kernel.h>
#include <linux/compiler.h>
#include <asm/barrier.h>
#include <linux/mii.h>
#include <libvfio/vfio_pci_device.h>
#include "e1000_regs.h"
#include "e1000_defines.h"
#include "e1000_82575.h"
#define PCI_DEVICE_ID_INTEL_82576 0x10C9
#define IGB_MAX_CHUNK_SIZE 1024
#define MSIX_VECTOR 0
#define MSIX_VECTOR_MASK (1 << MSIX_VECTOR)
#define RING_SIZE 4096 /* Number of descriptors in ring */
struct igb_tx_desc {
union {
struct {
u64 buffer_addr; /* Address of descriptor's data buffer */
u32 cmd_type_len; /* Command/Type/Length */
u32 olinfo_status; /* Context/Buffer info */
} read;
struct {
u64 rsvd; /* Reserved */
u32 nxtseq_seed; /* Next sequence seed */
u32 status; /* Descriptor status */
} wb;
};
};
struct igb_rx_desc {
union {
struct {
u64 pkt_addr; /* Packet buffer address */
u64 hdr_addr; /* Header buffer address */
} read;
struct {
u16 pkt_info; /* RSS type, Packet type */
u16 hdr_info; /* Split Head, buf len */
u32 rss; /* RSS Hash */
u32 status_error; /* ext status/error */
u16 length; /* Packet length */
u16 vlan; /* VLAN tag */
} wb; /* writeback */
};
};
struct igb {
void *bar0;
u32 tx_tail;
u32 rx_tail;
struct igb_tx_desc tx_ring[RING_SIZE] __attribute__((aligned(128)));
struct igb_rx_desc rx_ring[RING_SIZE] __attribute__((aligned(128)));
};
static inline struct igb *to_igb_state(struct vfio_pci_device *device)
{
return (struct igb *)device->driver.region.vaddr;
}
static inline void igb_write32(struct igb *igb, u32 reg, u32 val)
{
writel(val, igb->bar0 + reg);
}
static inline u32 igb_read32(struct igb *igb, u32 reg)
{
return readl(igb->bar0 + reg);
}
static int igb_write_phy(struct igb *igb, u32 offset, u16 data)
{
u32 mdic;
int i;
/*
* Write a PHY register over MDIO.
*
* A production driver would hold the SW/FW semaphore (SWSM.SWESMBI + the
* SW_FW_SYNC PHY bit) across the MDIO transaction to serialize against the
* device's management firmware. The selftest owns the assigned function
* exclusively on a dedicated test device with no active manageability
* contending for the PHY, so the sync is omitted; it should be added here
* if this ever needs to run on a manageability-enabled NIC.
*/
mdic = (((u32)data) |
(offset << E1000_MDIC_REG_SHIFT) |
(1 << E1000_MDIC_PHY_SHIFT) |
E1000_MDIC_OP_WRITE);
igb_write32(igb, E1000_MDIC, mdic);
for (i = 0; i < 1000; i++) {
usleep(50);
mdic = igb_read32(igb, E1000_MDIC);
if (mdic & E1000_MDIC_READY)
break;
}
if (!(mdic & E1000_MDIC_READY))
return -1;
if (mdic & E1000_MDIC_ERROR)
return -1;
return 0;
}
/*
* Configure the device for PHY internal loopback per 82576 datasheet
* section 3.5.6.3.1. Force the PHY to 1Gb/s full duplex with loopback
* enabled, then force the MAC link state to match. Internal loopback
* wraps data at the end of the PHY datapath (section 3.5.6.3), so the
* physical link state is irrelevant.
*
* Section 3.5.6.1 directs to "Use PHY Loopback instead of MAC Loopback
* on the 82576", and section 3.5.6.2 states "MAC Loopback is not used
* on this device." RCTL.LBM_MAC is still set elsewhere as a QEMU-only
* accommodation; see the RCTL programming in the caller for the
* rationale.
*/
static void igb_setup_loopback(struct igb *igb)
{
u32 ctrl;
int ret;
/*
* Kick the autoneg machinery solely to bring STATUS.LU up under
* QEMU's igb emulation: QEMU only updates STATUS.LU via its
* autoneg-done timer, and without LU set its receive path
* (e1000x_hw_rx_enabled) drops every loopback frame. On real
* hardware autoneg cannot complete before the next PHY write
* below clears the autoneg-enable bit, so this is effectively a
* no-op there.
*/
(void)igb_write_phy(igb, MII_BMCR,
BMCR_ANENABLE | BMCR_ANRESTART);
/* PHY control: loopback + 1Gb/s full duplex, autoneg disabled. */
ret = igb_write_phy(igb, MII_BMCR,
BMCR_LOOPBACK |
BMCR_SPEED1000 |
BMCR_FULLDPLX);
VFIO_ASSERT_EQ(ret, 0, "Failed to write PHY control register");
/*
* Brief delay before forcing the MAC, mirroring the kernel ethtool
* selftest in igb_integrated_phy_loopback(). Not specified by the
* datasheet, but empirically required by the kernel driver.
*/
usleep(50000);
/*
* Force the MAC to 1Gb/s full duplex with link up. Without forcing
* the link state the descriptor engine does not run, since the chip
* normally waits for a real negotiated link.
*/
ctrl = igb_read32(igb, E1000_CTRL);
ctrl &= ~E1000_CTRL_SPD_SEL;
ctrl |= E1000_CTRL_FRCSPD |
E1000_CTRL_FRCDPX |
E1000_CTRL_SPD_1000 |
E1000_CTRL_FD |
E1000_CTRL_SLU;
igb_write32(igb, E1000_CTRL, ctrl);
/*
* Settling delay matching the kernel ethtool selftest's msleep(500)
* at the tail of igb_integrated_phy_loopback(). Not specified by
* the datasheet; empirical, and inherited from the kernel driver.
*/
usleep(500000);
}
static int igb_probe(struct vfio_pci_device *device)
{
if (!vfio_pci_device_match(device, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82576))
return -EINVAL;
return 0;
}
static void igb_reset(struct igb *igb)
{
int retries = 20;
igb_write32(igb, E1000_CTRL, igb_read32(igb, E1000_CTRL) | E1000_CTRL_RST);
/*
* Must wait at least 1 millisecond after setting the reset bit before
* checking if this device is ready to be used (82576 datasheet section
* 4.2.1.6.1). The delay also ensures the reset has taken effect and
* cleared EECD.AUTO_RD before it is polled below.
*/
usleep(1000);
/*
* Poll NVM Auto Read Done rather than CTRL.RST, matching
* igb_get_auto_rd_done() in the igb driver: AUTO_RD implies both that
* the reset completed and that the device finished re-reading its
* configuration from NVM, which is what actually makes it usable.
*/
while (retries-- > 0 && !(igb_read32(igb, E1000_EECD) & E1000_EECD_AUTO_RD))
usleep(1000);
/*
* QEMU's igb emulation does not set E1000_EECD_AUTO_RD. If we timed out,
* check if CTRL.RST is cleared, which is what QEMU uses to signal reset
* completion.
*/
if (retries < 0) {
VFIO_ASSERT_EQ(igb_read32(igb, E1000_CTRL) & E1000_CTRL_RST, 0,
"Device reset did not complete (CTRL.RST not cleared)");
}
igb_write32(igb, E1000_IMC, 0xFFFFFFFF);
}
/*
* Program the device into a usable state. Split out of igb_init() so it
* can be reused after a device reset to re-program the registers that
* CTRL.RST clears. Expects bar0 to be mapped and MSI-X already enabled
* via VFIO.
*/
static void igb_hw_init(struct vfio_pci_device *device)
{
struct igb *igb = to_igb_state(device);
u64 iova_tx, iova_rx;
u32 ctrl, rctl;
u16 cmd_reg;
int retries;
iova_tx = to_iova(device, igb->tx_ring);
iova_rx = to_iova(device, igb->rx_ring);
/* Signal that the driver is loaded */
ctrl = igb_read32(igb, E1000_CTRL_EXT);
ctrl |= E1000_CTRL_EXT_DRV_LOAD;
ctrl &= ~E1000_CTRL_EXT_LINK_MODE_MASK;
igb_write32(igb, E1000_CTRL_EXT, ctrl);
/* Enable PCI Bus Master. */
cmd_reg = vfio_pci_config_readw(device, PCI_COMMAND);
if ((cmd_reg & (PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY)) !=
(PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY)) {
cmd_reg |= (PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY);
vfio_pci_config_writew(device, PCI_COMMAND, cmd_reg);
}
/* Configure PHY internal loopback for testing. */
igb_setup_loopback(igb);
/*
* Disable DMA re-send on PCIe completion timeout (82576 datasheet
* section 8.6.1, GCR.Completion_Timeout_Resend, bit 16). The
* mix_and_match test intentionally submits descriptors targeting
* unmapped IOVAs; with the default (set) value, the device keeps
* retrying the failed read indefinitely, which keeps PCIe AER and
* IOMMU error handling busy and interferes with reset recovery.
*/
ctrl = igb_read32(igb, E1000_GCR);
ctrl &= ~E1000_GCR_CMPL_TMOUT_RESEND;
igb_write32(igb, E1000_GCR, ctrl);
/* Configure TX and RX descriptor rings */
igb_write32(igb, E1000_TDBAL(0), (u32)iova_tx);
igb_write32(igb, E1000_TDBAH(0), (u32)(iova_tx >> 32));
igb_write32(igb, E1000_TDLEN(0), RING_SIZE * sizeof(struct igb_tx_desc));
igb_write32(igb, E1000_TDH(0), 0);
igb_write32(igb, E1000_TDT(0), 0);
igb_write32(igb, E1000_TXDCTL(0), E1000_TXDCTL_QUEUE_ENABLE);
igb_write32(igb, E1000_RDBAL(0), (u32)iova_rx);
igb_write32(igb, E1000_RDBAH(0), (u32)(iova_rx >> 32));
igb_write32(igb, E1000_RDLEN(0), RING_SIZE * sizeof(struct igb_rx_desc));
igb_write32(igb, E1000_RDH(0), 0);
igb_write32(igb, E1000_RDT(0), 0);
/*
* Select the advanced one-buffer descriptor format. Per 82576
* datasheet section 7.1.5.2: "SRRCTL[n].DESCTYPE must be set to a
* value other than 000b for the 82576 to write back the special
* descriptors." struct igb_rx_desc matches the advanced one-buffer
* writeback layout (section 7.1.5.2), so polling rx.wb.status_error
* requires this format. Section 8.10.2 specifies DESCTYPE[27:25].
*
* The direct write also zeroes SRRCTL.BSIZEPACKET, which is
* intentional: per section 7.1.3.1 a zero BSIZEPACKET falls back to
* the RCTL.BSIZE buffer size, whose reset default (00b) is 2048
* bytes -- ample for the loopback frames here.
*/
igb_write32(igb, E1000_SRRCTL(0), E1000_SRRCTL_DESCTYPE_ADV_ONEBUF);
igb_write32(igb, E1000_RXDCTL(0), E1000_RXDCTL_QUEUE_ENABLE);
/*
* Enable Receiver and Transmitter. RCTL.LBM_MAC is set in addition
* to PHY loopback as a QEMU-only accommodation: QEMU's emulated igb
* does not honor PHY register 0 bit 14 (PHY internal loopback) and
* relies on RCTL.LBM_MAC to wrap TX descriptors back to the RX
* queue. Datasheet 8.10.1 (RCTL register) advises "When using the
* internal PHY, LBM should remain set to 00b", so setting LBM_MAC
* here deviates from datasheet guidance; empirically the bit has
* no observable effect on real 82576 hardware because MAC loopback
* is not implemented (datasheet 3.5.6.2). Setting both lets the
* selftest work on both real hardware and QEMU without conditional
* code paths.
*/
rctl = E1000_RCTL_EN | /* Receiver Enable */
E1000_RCTL_UPE | /* Unicast Promiscuous (for dummy MAC) */
E1000_RCTL_MPE | /* Multicast Promiscuous */
E1000_RCTL_BAM | /* Broadcast Accept Mode */
E1000_RCTL_LBM_MAC | /* MAC Loopback - for QEMU emulation only */
E1000_RCTL_SECRC; /* Strip CRC (needed for memcmp) */
igb_write32(igb, E1000_RCTL, rctl);
igb_write32(igb, E1000_TCTL, E1000_TCTL_EN | E1000_TCTL_PSP);
/*
* Wait for TX and RX queues to be enabled. Per the RXDCTL/TXDCTL
* register definitions (8.10.10/8.12.13), the per-queue enable bit
* "remains zero" until the global RCTL.RXEN/TCTL.TXEN are set, so
* E1000_RCTL_EN and E1000_TCTL_EN must already be written above.
*/
retries = 2000;
while (retries-- > 0) {
if ((igb_read32(igb, E1000_TXDCTL(0)) & E1000_TXDCTL_QUEUE_ENABLE) &&
(igb_read32(igb, E1000_RXDCTL(0)) & E1000_RXDCTL_QUEUE_ENABLE))
break;
usleep(10);
}
VFIO_ASSERT_GE(retries, 0);
/*
* Program MSI-X interrupt routing per 82576 datasheet:
*
* GPIE (section 7.3.2.11, Table 7-47): set Multiple_MSIX (bit 4) to
* route interrupt causes through IVAR mapping, and EIAME (bit 30)
* to apply EIAM on MSI-X assertion (without EIAME, EIAM only
* applies on EICR read/write).
*
* EIAC (section 8.8.5): enable auto-clear of EICR for vector 0.
* Without auto-clear the cause stays set after delivery and the
* test can see spurious interrupts on the next memcpy batch.
*
* EIAM (section 8.8.6): enable auto-mask of EIMS for vector 0 on
* MSI-X assertion (effective because EIAME is set).
*
* IVAR (section 7.3.1.2, register definition in 8.8.13): map RX
* cause 0 to MSI-X vector 0 and mark the entry valid.
*/
igb_write32(igb, E1000_GPIE, E1000_GPIE_MSIX_MODE | E1000_GPIE_EIAME);
igb_write32(igb, E1000_EIAC, MSIX_VECTOR_MASK);
igb_write32(igb, E1000_EIAM, MSIX_VECTOR_MASK);
/* Map vector 0 to interrupt cause 0 and mark it valid */
igb_write32(igb, E1000_IVAR0, E1000_IVAR_VALID);
/* Enable interrupts on vector 0 */
igb_write32(igb, E1000_EIMS, MSIX_VECTOR_MASK);
/* Initialize driver state and capability limits */
igb->tx_tail = 0;
igb->rx_tail = 0;
device->driver.max_memcpy_size = IGB_MAX_CHUNK_SIZE;
device->driver.max_memcpy_count = RING_SIZE - 1;
device->driver.msi = MSIX_VECTOR;
}
static void igb_init(struct vfio_pci_device *device)
{
struct igb *igb = to_igb_state(device);
VFIO_ASSERT_GE(device->driver.region.size, sizeof(struct igb));
igb->bar0 = device->bars[0].vaddr;
igb_reset(igb);
/*
* Enable MSI-X via VFIO before device-side register programming.
* vfio_pci_msix_enable() only touches the VFIO IRQ machinery and the
* PCI MSI-X capability via config space; it has no ordering
* dependency on the device-side writes performed by igb_hw_init().
* Placing it here keeps igb_hw_init() reusable from the reset
* recovery path (which calls vfio_pci_irq_reenable() instead).
*/
vfio_pci_msix_enable(device, MSIX_VECTOR, 1);
igb_hw_init(device);
}
static void igb_remove(struct vfio_pci_device *device)
{
struct igb *igb = to_igb_state(device);
igb_write32(igb, E1000_RCTL, 0);
igb_write32(igb, E1000_TCTL, 0);
igb_reset(igb);
vfio_pci_msix_disable(device);
}
static void igb_irq_disable(struct igb *igb)
{
igb_write32(igb, E1000_EIMC, MSIX_VECTOR_MASK);
}
static void igb_irq_enable(struct igb *igb)
{
igb_write32(igb, E1000_EIMS, MSIX_VECTOR_MASK);
}
static void igb_irq_clear(struct igb *igb)
{
/*
* Use write-to-clear (datasheet 7.3.4.2). In MSI-X mode with EIAC
* programmed, section 8.8.5 explicitly states "If any bits are set
* in EIAC, the EICR register should not be read", which rules out
* the read-to-clear path in 7.3.4.3. Bits not in EIAC are still
* cleared by writing 1.
*/
igb_write32(igb, E1000_EICR, 0xFFFFFFFF);
}
static void igb_memcpy_start(struct vfio_pci_device *device, iova_t src,
iova_t dst, u64 size, u64 count)
{
struct igb *igb = to_igb_state(device);
struct igb_rx_desc *rx;
struct igb_tx_desc *tx;
u32 i;
VFIO_ASSERT_GE(size, 60,
"IGB driver requires memcpy size to be at least 60 bytes (Ethernet minimum payload size)");
igb_irq_disable(igb);
for (i = 0; i < count; i++) {
tx = &igb->tx_ring[igb->tx_tail];
rx = &igb->rx_ring[igb->rx_tail];
memset(tx, 0, sizeof(struct igb_tx_desc));
memset(rx, 0, sizeof(struct igb_rx_desc));
rx->read.pkt_addr = cpu_to_le64(dst);
rx->read.hdr_addr = cpu_to_le64(0);
tx->read.buffer_addr = cpu_to_le64(src);
/*
* Build an advanced data descriptor per 82576 datasheet
* section 7.2.2.3. DEXT marks the descriptor as advanced
* (required by hardware); DTYP=data selects the data
* descriptor; IFCS asks the MAC to append the Ethernet
* FCS (without it the frame is dropped as malformed);
* EOP marks end of packet. DTALEN is the buffer length
* in bits 15:0 of cmd_type_len.
*/
tx->read.cmd_type_len = cpu_to_le32((uint32_t)size |
E1000_ADVTXD_DTYP_DATA |
E1000_ADVTXD_DCMD_DEXT |
E1000_ADVTXD_DCMD_IFCS |
E1000_ADVTXD_DCMD_EOP);
/*
* PAYLEN (section 7.2.2.3.11) is the total payload size
* in olinfo_status[31:14].
*/
tx->read.olinfo_status =
cpu_to_le32((uint32_t)size << E1000_ADVTXD_PAYLEN_SHIFT);
igb->tx_tail = (igb->tx_tail + 1) % RING_SIZE;
igb->rx_tail = (igb->rx_tail + 1) % RING_SIZE;
}
igb_write32(igb, E1000_RDT(0), igb->rx_tail);
igb_write32(igb, E1000_TDT(0), igb->tx_tail);
}
/*
* Reset the device via VFIO_DEVICE_RESET (PCIe FLR on the 82576) and
* re-program it. VFIO_DEVICE_RESET tears down the kernel-side MSI-X
* trigger but leaves user-side eventfds intact, so re-arm the trigger
* via vfio_pci_irq_reenable() before reprogramming so any caller-cached
* eventfd remains valid.
*
* FLR clears device-side state to power-on reset values (datasheet
* 4.2.1.5.1: a PF FLR is "equivalent to a D0->D3->D0 transition"), so
* EIMS and EICR come back as 0 from their register-defined initial
* values, and igb_hw_init() resets tx_tail/rx_tail to 0. The next
* igb_memcpy_start() will memset each descriptor it touches before
* submission, so no explicit IMC/EICR writes or ring memsets are
* needed here.
*/
static void igb_error_reset_and_reinit(struct vfio_pci_device *device)
{
vfio_pci_device_reset(device);
vfio_pci_msix_reenable(device, MSIX_VECTOR, 1);
igb_hw_init(device);
}
static int igb_memcpy_wait(struct vfio_pci_device *device)
{
struct igb *igb = to_igb_state(device);
struct igb_rx_desc *rx;
u32 status = 0;
u32 prev_tail;
int retries;
prev_tail = (igb->rx_tail + RING_SIZE - 1) % RING_SIZE;
rx = &igb->rx_ring[prev_tail];
/*
* Real 82576 hardware processes the descriptor ring at line rate.
* max_memcpy_size = (RING_SIZE - 1) * IGB_MAX_CHUNK_SIZE ~= 4 MB,
* split into 4095 1 KB frames. At 1 Gb/s (~125 MB/s) the worst
* valid memcpy takes ~32 ms on the wire, plus per-frame preamble,
* SFD, IFG and FCS overhead (~3%) and descriptor fetch/writeback
* latency. Wait up to ~200 ms before declaring the device hung;
* ~6x the line-rate floor leaves comfortable headroom for host
* scheduling jitter while keeping the intentional invalid-DMA
* tests bounded.
*/
retries = 200;
while (retries-- > 0) {
status = le32_to_cpu(READ_ONCE(rx->wb.status_error));
if (status & 1)
break;
usleep(1000);
}
if (status & 1)
/*
* Ensure the test code doesn't speculatively read the DMA
* destination buffer before we have verified that the
* descriptor writeback is complete.
*/
rmb();
igb_irq_clear(igb);
igb_irq_enable(igb);
if (status & 1)
return 0;
/*
* The descriptor never completed. On real 82576 hardware this
* typically follows a DMA-read fault from one of the intentional
* unmapped-IOVA tests; the fault leaves the descriptor engine
* unable to service subsequent valid descriptors. CTRL.RST alone
* reinitializes the queue registers but leaves the engine wedged
* for the current process, so a broader VFIO_DEVICE_RESET (FLR)
* is required.
*/
igb_error_reset_and_reinit(device);
return -ETIMEDOUT;
}
static void igb_send_msi(struct vfio_pci_device *device)
{
struct igb *igb = to_igb_state(device);
igb_write32(igb, E1000_EICS, MSIX_VECTOR_MASK);
}
const struct vfio_pci_driver_ops igb_ops = {
.name = "igb",
.probe = igb_probe,
.init = igb_init,
.remove = igb_remove,
.memcpy_start = igb_memcpy_start,
.memcpy_wait = igb_memcpy_wait,
.send_msi = igb_send_msi,
};