Every driver reached its registers with P2V(bar.base), which assumes the BAR sits inside the 0-4 GB the direct map covers. Under SeaBIOS it always does. Under OVMF it does not: firmware may place a 64-bit BAR anywhere, and it puts virtio-gpu's at about 768 GB. P2V produced an address with no translation behind it, so the driver's first register write took a page fault, then a double fault, then a triple fault and a reboot loop -- which, coming from a driver bind, reads as broken hardware rather than a missing mapping. ioremap() carries each region on a 1 GB page in PDPT entries 4-511, which were unused: the direct map occupies 0-3, and kpml4[0], kpml4[KERNBASE] and every process's PML4 all share that one table, so a mapping appears in every address space at once with no page table to allocate. The pages are cache-disabled and write-through for the same reason the top GB of the direct map is -- these are registers, and a write sitting in a cache line is a write the device never sees. A physical address below 4 GB returns the direct-map address unchanged, so the BIOS path, where every BAR is low, is byte for byte what it was. virtio-gpu now initialises under OVMF (1280x800, queue 64) instead of triple faulting. e1000 and xhci had the identical latent bug; xhci was already refusing to bind above 4 GB with a comment saying the mapping did not exist yet, and now it does. BIOS unchanged: bootcheck 108 [ok] with -Fb -Tty -Usb -Sock -Evdev -Ps, e1000 and xhci both binding. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
461 lines
15 KiB
C
461 lines
15 KiB
C
// Intel 8254x gigabit Ethernet, written from Intel's public datasheet (317453).
|
|
//
|
|
// The first network device. There is no IP stack yet, so what this provides is
|
|
// the layer under one: a MAC address, a transmit path, and a receive ring that
|
|
// fills with frames. That is deliberately the right order -- an IP stack
|
|
// written before a driver has nothing to be tested against, and every bug in it
|
|
// looks like a driver bug.
|
|
//
|
|
// Bring-up follows the manual's initialisation sequence (section 14.3-14.5):
|
|
// reset, read the MAC out of EEPROM, clear the multicast table, set up the
|
|
// receive and transmit rings, then enable each. The order matters -- enabling a
|
|
// receiver whose ring base is still zero makes the device DMA into physical
|
|
// address 0, which on this kernel is the boot page table.
|
|
|
|
#include "types.h"
|
|
#include "defs.h"
|
|
#include "param.h"
|
|
#include "x86.h"
|
|
#include "spinlock.h"
|
|
#include "sleeplock.h"
|
|
#include "fs.h"
|
|
#include "file.h"
|
|
#include "mmu.h"
|
|
#include "memlayout.h"
|
|
#include "pci.h"
|
|
#include "device.h"
|
|
#include "dma.h"
|
|
#include "irq.h"
|
|
#include "e1000.h"
|
|
|
|
struct e1000 {
|
|
volatile uint8 *regs;
|
|
|
|
struct e1000_tx_desc *tx;
|
|
struct e1000_rx_desc *rx;
|
|
uint8 *txbuf[E1000_NTX];
|
|
uint8 *rxbuf[E1000_NRX];
|
|
uint16 tx_next;
|
|
uint16 rx_next;
|
|
|
|
uint8 mac[6];
|
|
int ready;
|
|
uint64 rx_packets, tx_packets, rx_dropped;
|
|
|
|
struct spinlock lock;
|
|
};
|
|
|
|
static struct e1000 nic;
|
|
|
|
static inline uint32 rd(struct e1000 *e, int off) { return *(volatile uint32 *)(e->regs + off); }
|
|
static inline void wr(struct e1000 *e, int off, uint32 v) { *(volatile uint32 *)(e->regs + off) = v; }
|
|
|
|
// The EEPROM is read one 16-bit word at a time through a single register: write
|
|
// the address with the start bit, poll for done, take the data out of the top
|
|
// half.
|
|
//
|
|
// Bounded, because a device whose EEPROM never reports done would otherwise
|
|
// hang the boot -- and QEMU's e1000 does answer, but a real card with a blank
|
|
// EEPROM is a thing that exists.
|
|
static int
|
|
eeprom_read(struct e1000 *e, int addr, uint16 *out)
|
|
{
|
|
wr(e, E1000_EERD, (addr << E1000_EERD_ADDR_SHIFT) | E1000_EERD_START);
|
|
for (int i = 0; i < 100000; i++) {
|
|
uint32 v = rd(e, E1000_EERD);
|
|
if (v & E1000_EERD_DONE) {
|
|
*out = (uint16)(v >> E1000_EERD_DATA_SHIFT);
|
|
return 0;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
// The MAC address, from EEPROM words 0..2, little-endian within each word.
|
|
//
|
|
// Falls back to the receive-address registers, which the firmware may already
|
|
// have programmed. QEMU fills both; some cards leave the EEPROM path
|
|
// unimplemented, and a driver that only knows one of the two ends up with a MAC
|
|
// of all zeroes and no idea why nothing answers it.
|
|
static void
|
|
read_mac(struct e1000 *e)
|
|
{
|
|
uint16 w;
|
|
int ok = 1;
|
|
|
|
for (int i = 0; i < 3; i++) {
|
|
if (eeprom_read(e, i, &w) != 0) { ok = 0; break; }
|
|
e->mac[i * 2] = (uint8)(w & 0xFF);
|
|
e->mac[i * 2 + 1] = (uint8)(w >> 8);
|
|
}
|
|
if (ok)
|
|
return;
|
|
|
|
uint32 lo = rd(e, E1000_RAL), hi = rd(e, E1000_RAH);
|
|
e->mac[0] = (uint8)lo; e->mac[1] = (uint8)(lo >> 8);
|
|
e->mac[2] = (uint8)(lo >> 16); e->mac[3] = (uint8)(lo >> 24);
|
|
e->mac[4] = (uint8)hi; e->mac[5] = (uint8)(hi >> 8);
|
|
}
|
|
|
|
static int
|
|
rings_setup(struct e1000 *e)
|
|
{
|
|
// One block for both rings and every buffer, from the DMA arena: the device
|
|
// reads all of it by physical address, and kalloc's pages are contiguous only
|
|
// by accident.
|
|
uint32 txring = E1000_NTX * sizeof(struct e1000_tx_desc);
|
|
uint32 rxring = E1000_NRX * sizeof(struct e1000_rx_desc);
|
|
|
|
e->tx = dma_alloc(txring, 16);
|
|
e->rx = dma_alloc(rxring, 16);
|
|
if (!e->tx || !e->rx)
|
|
return -1;
|
|
memset(e->tx, 0, txring);
|
|
memset(e->rx, 0, rxring);
|
|
|
|
for (int i = 0; i < E1000_NTX; i++) {
|
|
e->txbuf[i] = dma_alloc(E1000_BUFSZ, 16);
|
|
if (!e->txbuf[i])
|
|
return -1;
|
|
e->tx[i].addr = dma_phys(e->txbuf[i]);
|
|
// DD set on every transmit descriptor at start-up, so the first pass round
|
|
// the ring sees them as free. The hardware only sets it after it has used
|
|
// one, and a driver that waits for a bit the device has never had reason to
|
|
// write waits forever.
|
|
e->tx[i].status = E1000_TXD_STAT_DD;
|
|
}
|
|
|
|
for (int i = 0; i < E1000_NRX; i++) {
|
|
e->rxbuf[i] = dma_alloc(E1000_BUFSZ, 16);
|
|
if (!e->rxbuf[i])
|
|
return -1;
|
|
e->rx[i].addr = dma_phys(e->rxbuf[i]);
|
|
e->rx[i].status = 0;
|
|
}
|
|
|
|
wr(e, E1000_TDBAL, (uint32)dma_phys(e->tx));
|
|
wr(e, E1000_TDBAH, (uint32)(dma_phys(e->tx) >> 32));
|
|
wr(e, E1000_TDLEN, txring);
|
|
wr(e, E1000_TDH, 0);
|
|
wr(e, E1000_TDT, 0);
|
|
|
|
wr(e, E1000_RDBAL, (uint32)dma_phys(e->rx));
|
|
wr(e, E1000_RDBAH, (uint32)(dma_phys(e->rx) >> 32));
|
|
wr(e, E1000_RDLEN, rxring);
|
|
wr(e, E1000_RDH, 0);
|
|
// Tail points at the last descriptor the hardware may fill. Setting it to
|
|
// NRX-1 hands it every descriptor but one; the ring is full when head meets
|
|
// tail, so one must always be held back or "full" and "empty" look identical.
|
|
wr(e, E1000_RDT, E1000_NRX - 1);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Queue one frame. Returns 0, or -1 if the ring is full.
|
|
//
|
|
// Copies into the descriptor's own buffer rather than mapping the caller's.
|
|
// A zero-copy path wants the caller to guarantee the memory stays put and is
|
|
// physically contiguous, which nothing above this can promise yet.
|
|
int
|
|
e1000_transmit(const void *frame, int len)
|
|
{
|
|
struct e1000 *e = &nic;
|
|
|
|
if (!e->ready || len <= 0 || len > E1000_BUFSZ)
|
|
return -1;
|
|
|
|
acquire(&e->lock);
|
|
struct e1000_tx_desc *d = &e->tx[e->tx_next];
|
|
if (!(d->status & E1000_TXD_STAT_DD)) {
|
|
release(&e->lock);
|
|
return -1; // the device has not finished with it
|
|
}
|
|
|
|
memmove(e->txbuf[e->tx_next], frame, len);
|
|
d->length = (uint16)len;
|
|
d->cmd = E1000_TXD_CMD_EOP | E1000_TXD_CMD_IFCS | E1000_TXD_CMD_RS;
|
|
d->status = 0;
|
|
|
|
e->tx_next = (uint16)((e->tx_next + 1) % E1000_NTX);
|
|
__sync_synchronize(); // descriptor visible before the tail moves
|
|
wr(e, E1000_TDT, e->tx_next);
|
|
e->tx_packets++;
|
|
release(&e->lock);
|
|
return 0;
|
|
}
|
|
|
|
// Take one received frame, if there is one. Returns its length, or 0.
|
|
//
|
|
// Polled. There is nothing above this to wake yet, and a receive path that
|
|
// wakes a nonexistent protocol stack is harder to reason about than one that is
|
|
// asked. The interrupt handler below exists to keep the cause register clear
|
|
// and to count; when an IP stack arrives, this is where the hand-off changes.
|
|
int
|
|
e1000_receive(void *out, int cap)
|
|
{
|
|
struct e1000 *e = &nic;
|
|
|
|
if (!e->ready)
|
|
return 0;
|
|
|
|
acquire(&e->lock);
|
|
struct e1000_rx_desc *d = &e->rx[e->rx_next];
|
|
if (!(d->status & E1000_RXD_STAT_DD)) {
|
|
release(&e->lock);
|
|
return 0;
|
|
}
|
|
|
|
int len = d->length;
|
|
if (len > cap)
|
|
len = cap;
|
|
memmove(out, e->rxbuf[e->rx_next], len);
|
|
|
|
d->status = 0;
|
|
__sync_synchronize();
|
|
// Hand the descriptor back by moving the tail to it. The tail always trails
|
|
// the descriptor just released, which is why it is the *previous* index.
|
|
wr(e, E1000_RDT, e->rx_next);
|
|
e->rx_next = (uint16)((e->rx_next + 1) % E1000_NRX);
|
|
e->rx_packets++;
|
|
release(&e->lock);
|
|
return len;
|
|
}
|
|
|
|
static void
|
|
e1000_intr(void *arg)
|
|
{
|
|
struct e1000 *e = arg;
|
|
// Reading ICR clears it. Not reading it leaves the cause asserted, and with a
|
|
// level-triggered PCI interrupt that means the handler is re-entered forever.
|
|
uint32 cause = rd(e, E1000_ICR);
|
|
(void)cause;
|
|
}
|
|
|
|
int
|
|
e1000_info(char *buf, int cap)
|
|
{
|
|
struct e1000 *e = &nic;
|
|
int n = 0;
|
|
|
|
if (!e->ready)
|
|
return 0;
|
|
|
|
static const char hex[] = "0123456789abcdef";
|
|
n += 0;
|
|
for (int i = 0; i < 6 && n + 3 < cap; i++) {
|
|
buf[n++] = hex[e->mac[i] >> 4];
|
|
buf[n++] = hex[e->mac[i] & 0xF];
|
|
if (i < 5)
|
|
buf[n++] = ':';
|
|
}
|
|
if (n < cap) buf[n++] = '\n';
|
|
return n;
|
|
}
|
|
|
|
static int
|
|
e1000_probe(struct pci_dev *d)
|
|
{
|
|
struct e1000 *e = &nic;
|
|
|
|
if (e->ready)
|
|
return -1;
|
|
if (!d->bar[0].base)
|
|
return -1;
|
|
|
|
initlock(&e->lock, "e1000");
|
|
pci_enable(d, 0x0006); // memory space + bus master
|
|
// ioremap rather than P2V: firmware may place a 64-bit BAR above the 4 GB the
|
|
// direct map covers. It returns the direct-map address unchanged for a low
|
|
// BAR, which is every BAR under SeaBIOS.
|
|
e->regs = (volatile uint8 *)ioremap(d->bar[0].base, d->bar[0].size);
|
|
if (!e->regs)
|
|
return -1;
|
|
|
|
// Reset, then wait for it to clear. The manual asks for a delay after reset
|
|
// before any other register is touched; polling CTRL is that delay.
|
|
wr(e, E1000_CTRL, rd(e, E1000_CTRL) | E1000_CTRL_RST);
|
|
for (int i = 0; i < 1000000; i++)
|
|
if (!(rd(e, E1000_CTRL) & E1000_CTRL_RST))
|
|
break;
|
|
|
|
wr(e, E1000_IMC, 0xFFFFFFFF); // mask everything while we set up
|
|
rd(e, E1000_ICR); // and clear whatever was pending
|
|
|
|
wr(e, E1000_CTRL, rd(e, E1000_CTRL) | E1000_CTRL_SLU | E1000_CTRL_ASDE);
|
|
|
|
read_mac(e);
|
|
|
|
// The multicast table is undefined after reset. Left as it comes up, the
|
|
// device accepts multicast traffic for addresses nobody asked for.
|
|
for (int i = 0; i < 128; i++)
|
|
wr(e, E1000_MTA + i * 4, 0);
|
|
|
|
// Program our own MAC into the receive-address filter, with the valid bit.
|
|
{
|
|
uint32 lo = (uint32)e->mac[0] | ((uint32)e->mac[1] << 8) |
|
|
((uint32)e->mac[2] << 16) | ((uint32)e->mac[3] << 24);
|
|
uint32 hi = (uint32)e->mac[4] | ((uint32)e->mac[5] << 8) | (1u << 31);
|
|
wr(e, E1000_RAL, lo);
|
|
wr(e, E1000_RAH, hi);
|
|
}
|
|
|
|
if (rings_setup(e) != 0) {
|
|
cprintf("e1000: no DMA memory for the rings\n");
|
|
return -1;
|
|
}
|
|
|
|
wr(e, E1000_TIPG, 10 | (8 << 10) | (6 << 20)); // the manual's IEEE defaults
|
|
wr(e, E1000_TCTL, E1000_TCTL_EN | E1000_TCTL_PSP |
|
|
(0x10 << E1000_TCTL_CT_SHIFT) |
|
|
(0x40 << E1000_TCTL_COLD_SHIFT));
|
|
|
|
wr(e, E1000_RCTL, E1000_RCTL_EN | E1000_RCTL_BAM | E1000_RCTL_SECRC |
|
|
E1000_RCTL_SZ_2048 | E1000_RCTL_LBM_NONE);
|
|
|
|
if (d->irq != 0xFF)
|
|
// level_low = 1: this is a PCI interrupt, which is level-triggered and
|
|
// active low. Registering it as edge-triggered makes it fire once and then
|
|
// wedge, because the device holds the line asserted and no further edge
|
|
// ever arrives. See the comment on irq_register in include/irq.h.
|
|
irq_register(d->irq, e1000_intr, e, "e1000", 1);
|
|
wr(e, E1000_IMS, E1000_ICR_RXT0 | E1000_ICR_RXDMT0 | E1000_ICR_LSC);
|
|
|
|
e->ready = 1;
|
|
|
|
cprintf("e1000: %x:%x:%x:%x:%x:%x, link %s, irq %d\n",
|
|
e->mac[0], e->mac[1], e->mac[2], e->mac[3], e->mac[4], e->mac[5],
|
|
(rd(e, E1000_STATUS) & E1000_STATUS_LU) ? "up" : "down", d->irq);
|
|
return 0;
|
|
}
|
|
|
|
// Every 8254x that shares the register map above. See include/e1000.h for
|
|
// where the IDs come from and why the PCIe parts are excluded.
|
|
#define M(id) { E1000_VENDOR, (id), 0, 0 }
|
|
static const struct pci_match e1000_match[] = {
|
|
M(E1000_DEV_82540EM), M(E1000_DEV_82540EM_LOM),
|
|
M(E1000_DEV_82540EP_LOM), M(E1000_DEV_82540EP),
|
|
M(E1000_DEV_82540EP_LP),
|
|
M(E1000_DEV_82541EI), M(E1000_DEV_82541EI_MOBILE),
|
|
M(E1000_DEV_82541ER_LOM), M(E1000_DEV_82541ER),
|
|
M(E1000_DEV_82541GI), M(E1000_DEV_82541GI_MOBILE),
|
|
M(E1000_DEV_82541GI_LF),
|
|
M(E1000_DEV_82544EI_FIBER), M(E1000_DEV_82544GC_COPPER),
|
|
M(E1000_DEV_82544GC_LOM),
|
|
M(E1000_DEV_82545EM_COPPER), M(E1000_DEV_82545EM_FIBER),
|
|
M(E1000_DEV_82545GM_COPPER), M(E1000_DEV_82545GM_FIBER),
|
|
M(E1000_DEV_82545GM_SERDES),
|
|
M(E1000_DEV_82546EB_COPPER), M(E1000_DEV_82546EB_FIBER),
|
|
M(E1000_DEV_82546EB_QUAD),
|
|
M(E1000_DEV_82546GB_COPPER), M(E1000_DEV_82546GB_FIBER),
|
|
M(E1000_DEV_82546GB_SERDES),
|
|
M(E1000_DEV_82547EI),
|
|
{ 0, 0, 0, 0 },
|
|
};
|
|
#undef M
|
|
|
|
const struct pci_driver e1000_driver = {
|
|
.name = "e1000",
|
|
.devname = "eth",
|
|
.match = e1000_match,
|
|
.ops = 0, // no class vtable yet; there is no net class
|
|
.probe = e1000_probe,
|
|
};
|
|
|
|
// --- self-test: does this thing actually move packets? ---------------------
|
|
//
|
|
// The transmit and receive paths were written together and neither had ever
|
|
// carried a frame. That is exactly the state in which a driver looks finished
|
|
// and is not: the rings are set up, the registers read back plausibly, and the
|
|
// first thing to discover otherwise would have been a protocol stack failing
|
|
// for reasons indistinguishable from its own bugs.
|
|
//
|
|
// So: build an ARP request by hand, send it, and wait for the reply. It proves
|
|
// the whole path at once -- descriptor format, DD handshake, tail bookkeeping,
|
|
// DMA addresses, the receive ring handback, and the MAC filter -- because an
|
|
// ARP reply is addressed to *us* and will not arrive if the filter is wrong.
|
|
//
|
|
// Under QEMU's user-mode networking the guest is 10.0.2.15 and the gateway is
|
|
// 10.0.2.2. SLIRP is silent until spoken to, which is why this has to transmit
|
|
// before it can expect to receive.
|
|
//
|
|
// `echo n > /proc/sysrq`.
|
|
|
|
static void
|
|
put_be16(uint8 *p, uint16 v)
|
|
{
|
|
p[0] = (uint8)(v >> 8);
|
|
p[1] = (uint8)v;
|
|
}
|
|
|
|
const unsigned char *
|
|
e1000_mac(void)
|
|
{
|
|
return nic.mac;
|
|
}
|
|
|
|
void
|
|
e1000_selftest(void)
|
|
{
|
|
struct e1000 *e = &nic;
|
|
uint8 frame[42];
|
|
uint8 reply[E1000_BUFSZ];
|
|
|
|
if (!e->ready) {
|
|
cprintf("e1000: no device\n");
|
|
return;
|
|
}
|
|
|
|
static const uint8 me[4] = { 10, 0, 2, 15 }; // QEMU SLIRP guest address
|
|
static const uint8 them[4] = { 10, 0, 2, 2 }; // and its gateway
|
|
|
|
memset(frame, 0, sizeof(frame));
|
|
for (int i = 0; i < 6; i++)
|
|
frame[i] = 0xFF; // broadcast
|
|
for (int i = 0; i < 6; i++)
|
|
frame[6 + i] = e->mac[i];
|
|
put_be16(&frame[12], 0x0806); // ARP
|
|
|
|
put_be16(&frame[14], 1); // Ethernet
|
|
put_be16(&frame[16], 0x0800); // IPv4
|
|
frame[18] = 6; // hardware address length
|
|
frame[19] = 4; // protocol address length
|
|
put_be16(&frame[20], 1); // request
|
|
for (int i = 0; i < 6; i++)
|
|
frame[22 + i] = e->mac[i]; // sender hardware address
|
|
for (int i = 0; i < 4; i++)
|
|
frame[28 + i] = me[i]; // sender protocol address
|
|
// target hardware address stays zero -- that is what is being asked
|
|
for (int i = 0; i < 4; i++)
|
|
frame[38 + i] = them[i];
|
|
|
|
cprintf("e1000: asking who has %d.%d.%d.%d\n", them[0], them[1], them[2], them[3]);
|
|
if (e1000_transmit(frame, sizeof(frame)) != 0) {
|
|
cprintf("e1000: transmit ring full\n");
|
|
return;
|
|
}
|
|
|
|
// Bounded poll. There is no interrupt path to sleep on yet and this runs from
|
|
// a sysrq write, so spinning briefly is the honest way to wait.
|
|
for (int spin = 0; spin < 20000000; spin++) {
|
|
int n = e1000_receive(reply, sizeof(reply));
|
|
if (n <= 0)
|
|
continue;
|
|
|
|
cprintf("e1000: %d bytes from %x:%x:%x:%x:%x:%x type %x\n",
|
|
n, reply[6], reply[7], reply[8], reply[9], reply[10], reply[11],
|
|
((uint32)reply[12] << 8) | reply[13]);
|
|
|
|
if (n >= 42 && reply[12] == 0x08 && reply[13] == 0x06 &&
|
|
reply[20] == 0 && reply[21] == 2) {
|
|
cprintf("e1000: ARP reply -- %d.%d.%d.%d is at %x:%x:%x:%x:%x:%x\n",
|
|
reply[28], reply[29], reply[30], reply[31],
|
|
reply[22], reply[23], reply[24], reply[25],
|
|
reply[26], reply[27]);
|
|
cprintf("e1000: self-test passed, %d tx %d rx\n",
|
|
(int)e->tx_packets, (int)e->rx_packets);
|
|
return;
|
|
}
|
|
}
|
|
cprintf("e1000: no reply -- %d tx, %d rx\n",
|
|
(int)e->tx_packets, (int)e->rx_packets);
|
|
}
|