]> git.proxmox.com Git - mirror_qemu.git/blob - hw/e1000.c
E1000 NIC emulation (Nir Peleg, patch from Dor Laor).
[mirror_qemu.git] / hw / e1000.c
1 /*
2 * QEMU e1000 emulation
3 *
4 * Nir Peleg, Tutis Systems Ltd. for Qumranet Inc.
5 * Copyright (c) 2008 Qumranet
6 * Based on work done by:
7 * Copyright (c) 2007 Dan Aloni
8 * Copyright (c) 2004 Antony T Curtis
9 *
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2 of the License, or (at your option) any later version.
14 *
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 */
24
25
26 #include "hw.h"
27 #include "pci.h"
28 #include "net.h"
29
30 #define __iomem
31 typedef int boolean_t;
32 #include "e1000_hw.h"
33
34 #define DEBUG
35
36 #ifdef DEBUG
37 enum {
38 DEBUG_GENERAL, DEBUG_IO, DEBUG_MMIO, DEBUG_INTERRUPT,
39 DEBUG_RX, DEBUG_TX, DEBUG_MDIC, DEBUG_EEPROM,
40 DEBUG_UNKNOWN, DEBUG_TXSUM, DEBUG_TXERR, DEBUG_RXERR,
41 DEBUG_RXFILTER, DEBUG_NOTYET,
42 };
43 #define DBGBIT(x) (1<<DEBUG_##x)
44 static int debugflags = DBGBIT(TXERR) | DBGBIT(GENERAL);
45
46 #define DBGOUT(what, fmt, params...) do { \
47 if (debugflags & DBGBIT(what)) \
48 fprintf(stderr, "e1000: " fmt, ##params); \
49 } while (0)
50 #else
51 #define DBGOUT(what, fmt, params...) do {} while (0)
52 #endif
53
54 #define IOPORT_SIZE 0x40
55 #define PNPMMIO_SIZE 0x60000
56
57 /*
58 * HW models:
59 * E1000_DEV_ID_82540EM works with Windows and Linux
60 * E1000_DEV_ID_82573L OK with windoze and Linux 2.6.22,
61 * appears to perform better than 82540EM, but breaks with Linux 2.6.18
62 * E1000_DEV_ID_82544GC_COPPER appears to work; not well tested
63 * Others never tested
64 */
65 enum { E1000_DEVID = E1000_DEV_ID_82540EM };
66
67 /*
68 * May need to specify additional MAC-to-PHY entries --
69 * Intel's Windows driver refuses to initialize unless they match
70 */
71 enum {
72 PHY_ID2_INIT = E1000_DEVID == E1000_DEV_ID_82573L ? 0xcc2 :
73 E1000_DEVID == E1000_DEV_ID_82544GC_COPPER ? 0xc30 :
74 /* default to E1000_DEV_ID_82540EM */ 0xc20
75 };
76
77 typedef struct E1000State_st {
78 PCIDevice dev;
79 VLANClientState *vc;
80 NICInfo *nd;
81 uint32_t instance;
82 uint32_t mmio_base;
83 int mmio_index;
84
85 uint32_t mac_reg[0x8000];
86 uint16_t phy_reg[0x20];
87 uint16_t eeprom_data[64];
88
89 uint32_t rxbuf_size;
90 uint32_t rxbuf_min_shift;
91 int check_rxov;
92 struct e1000_tx {
93 unsigned char header[256];
94 unsigned char data[0x10000];
95 uint16_t size;
96 unsigned char sum_needed;
97 uint8_t ipcss;
98 uint8_t ipcso;
99 uint16_t ipcse;
100 uint8_t tucss;
101 uint8_t tucso;
102 uint16_t tucse;
103 uint8_t hdr_len;
104 uint16_t mss;
105 uint32_t paylen;
106 uint16_t tso_frames;
107 char tse;
108 char ip;
109 char tcp;
110 } tx;
111
112 struct {
113 uint32_t val_in; // shifted in from guest driver
114 uint16_t bitnum_in;
115 uint16_t bitnum_out;
116 uint16_t reading;
117 uint32_t old_eecd;
118 } eecd_state;
119 } E1000State;
120
121 #define defreg(x) x = (E1000_##x>>2)
122 enum {
123 defreg(CTRL), defreg(EECD), defreg(EERD), defreg(GPRC),
124 defreg(GPTC), defreg(ICR), defreg(ICS), defreg(IMC),
125 defreg(IMS), defreg(LEDCTL), defreg(MANC), defreg(MDIC),
126 defreg(MPC), defreg(PBA), defreg(RCTL), defreg(RDBAH),
127 defreg(RDBAL), defreg(RDH), defreg(RDLEN), defreg(RDT),
128 defreg(STATUS), defreg(SWSM), defreg(TCTL), defreg(TDBAH),
129 defreg(TDBAL), defreg(TDH), defreg(TDLEN), defreg(TDT),
130 defreg(TORH), defreg(TORL), defreg(TOTH), defreg(TOTL),
131 defreg(TPR), defreg(TPT), defreg(TXDCTL), defreg(WUFC),
132 defreg(RA), defreg(MTA), defreg(CRCERRS),
133 };
134
135 enum { PHY_R = 1, PHY_W = 2, PHY_RW = PHY_R | PHY_W };
136 static char phy_regcap[0x20] = {
137 [PHY_STATUS] = PHY_R, [M88E1000_EXT_PHY_SPEC_CTRL] = PHY_RW,
138 [PHY_ID1] = PHY_R, [M88E1000_PHY_SPEC_CTRL] = PHY_RW,
139 [PHY_CTRL] = PHY_RW, [PHY_1000T_CTRL] = PHY_RW,
140 [PHY_LP_ABILITY] = PHY_R, [PHY_1000T_STATUS] = PHY_R,
141 [PHY_AUTONEG_ADV] = PHY_RW, [M88E1000_RX_ERR_CNTR] = PHY_R,
142 [PHY_ID2] = PHY_R,
143 };
144
145 static void
146 ioport_map(PCIDevice *pci_dev, int region_num, uint32_t addr,
147 uint32_t size, int type)
148 {
149 DBGOUT(IO, "e1000_ioport_map addr=0x%04x size=0x%08x\n", addr, size);
150 }
151
152 static void
153 set_interrupt_cause(E1000State *s, int index, uint32_t val)
154 {
155 if (val)
156 val |= E1000_ICR_INT_ASSERTED;
157 s->mac_reg[ICR] = val;
158 qemu_set_irq(s->dev.irq[0], (s->mac_reg[IMS] & s->mac_reg[ICR]) != 0);
159 }
160
161 static void
162 set_ics(E1000State *s, int index, uint32_t val)
163 {
164 DBGOUT(INTERRUPT, "set_ics %x, ICR %x, IMR %x\n", val, s->mac_reg[ICR],
165 s->mac_reg[IMS]);
166 set_interrupt_cause(s, 0, val | s->mac_reg[ICR]);
167 }
168
169 static int
170 rxbufsize(uint32_t v)
171 {
172 v &= E1000_RCTL_BSEX | E1000_RCTL_SZ_16384 | E1000_RCTL_SZ_8192 |
173 E1000_RCTL_SZ_4096 | E1000_RCTL_SZ_2048 | E1000_RCTL_SZ_1024 |
174 E1000_RCTL_SZ_512 | E1000_RCTL_SZ_256;
175 switch (v) {
176 case E1000_RCTL_BSEX | E1000_RCTL_SZ_16384:
177 return 16384;
178 case E1000_RCTL_BSEX | E1000_RCTL_SZ_8192:
179 return 8192;
180 case E1000_RCTL_BSEX | E1000_RCTL_SZ_4096:
181 return 4096;
182 case E1000_RCTL_SZ_1024:
183 return 1024;
184 case E1000_RCTL_SZ_512:
185 return 512;
186 case E1000_RCTL_SZ_256:
187 return 256;
188 }
189 return 2048;
190 }
191
192 static void
193 set_rx_control(E1000State *s, int index, uint32_t val)
194 {
195 s->mac_reg[RCTL] = val;
196 s->rxbuf_size = rxbufsize(val);
197 s->rxbuf_min_shift = ((val / E1000_RCTL_RDMTS_QUAT) & 3) + 1;
198 DBGOUT(RX, "RCTL: %d, mac_reg[RCTL] = 0x%x\n", s->mac_reg[RDT],
199 s->mac_reg[RCTL]);
200 }
201
202 static void
203 set_mdic(E1000State *s, int index, uint32_t val)
204 {
205 uint32_t data = val & E1000_MDIC_DATA_MASK;
206 uint32_t addr = ((val & E1000_MDIC_REG_MASK) >> E1000_MDIC_REG_SHIFT);
207
208 if ((val & E1000_MDIC_PHY_MASK) >> E1000_MDIC_PHY_SHIFT != 1) // phy #
209 val = s->mac_reg[MDIC] | E1000_MDIC_ERROR;
210 else if (val & E1000_MDIC_OP_READ) {
211 DBGOUT(MDIC, "MDIC read reg 0x%x\n", addr);
212 if (!(phy_regcap[addr] & PHY_R)) {
213 DBGOUT(MDIC, "MDIC read reg %x unhandled\n", addr);
214 val |= E1000_MDIC_ERROR;
215 } else
216 val = (val ^ data) | s->phy_reg[addr];
217 } else if (val & E1000_MDIC_OP_WRITE) {
218 DBGOUT(MDIC, "MDIC write reg 0x%x, value 0x%x\n", addr, data);
219 if (!(phy_regcap[addr] & PHY_W)) {
220 DBGOUT(MDIC, "MDIC write reg %x unhandled\n", addr);
221 val |= E1000_MDIC_ERROR;
222 } else
223 s->phy_reg[addr] = data;
224 }
225 s->mac_reg[MDIC] = val | E1000_MDIC_READY;
226 set_ics(s, 0, E1000_ICR_MDAC);
227 }
228
229 static uint32_t
230 get_eecd(E1000State *s, int index)
231 {
232 uint32_t ret = E1000_EECD_PRES|E1000_EECD_GNT | s->eecd_state.old_eecd;
233
234 DBGOUT(EEPROM, "reading eeprom bit %d (reading %d)\n",
235 s->eecd_state.bitnum_out, s->eecd_state.reading);
236 if (!s->eecd_state.reading ||
237 ((s->eeprom_data[(s->eecd_state.bitnum_out >> 4) & 0x3f] >>
238 ((s->eecd_state.bitnum_out & 0xf) ^ 0xf))) & 1)
239 ret |= E1000_EECD_DO;
240 return ret;
241 }
242
243 static void
244 set_eecd(E1000State *s, int index, uint32_t val)
245 {
246 uint32_t oldval = s->eecd_state.old_eecd;
247
248 s->eecd_state.old_eecd = val & (E1000_EECD_SK | E1000_EECD_CS |
249 E1000_EECD_DI|E1000_EECD_FWE_MASK|E1000_EECD_REQ);
250 if (!(E1000_EECD_SK & (val ^ oldval))) // no clock edge
251 return;
252 if (!(E1000_EECD_SK & val)) { // falling edge
253 s->eecd_state.bitnum_out++;
254 return;
255 }
256 if (!(val & E1000_EECD_CS)) { // rising, no CS (EEPROM reset)
257 memset(&s->eecd_state, 0, sizeof s->eecd_state);
258 return;
259 }
260 s->eecd_state.val_in <<= 1;
261 if (val & E1000_EECD_DI)
262 s->eecd_state.val_in |= 1;
263 if (++s->eecd_state.bitnum_in == 9 && !s->eecd_state.reading) {
264 s->eecd_state.bitnum_out = ((s->eecd_state.val_in & 0x3f)<<4)-1;
265 s->eecd_state.reading = (((s->eecd_state.val_in >> 6) & 7) ==
266 EEPROM_READ_OPCODE_MICROWIRE);
267 }
268 DBGOUT(EEPROM, "eeprom bitnum in %d out %d, reading %d\n",
269 s->eecd_state.bitnum_in, s->eecd_state.bitnum_out,
270 s->eecd_state.reading);
271 }
272
273 static uint32_t
274 flash_eerd_read(E1000State *s, int x)
275 {
276 unsigned int index, r = s->mac_reg[EERD] & ~E1000_EEPROM_RW_REG_START;
277
278 if ((index = r >> E1000_EEPROM_RW_ADDR_SHIFT) > EEPROM_CHECKSUM_REG)
279 return 0;
280 return (s->eeprom_data[index] << E1000_EEPROM_RW_REG_DATA) |
281 E1000_EEPROM_RW_REG_DONE | r;
282 }
283
284 static unsigned int
285 do_cksum(uint8_t *dp, uint8_t *de)
286 {
287 unsigned int bsum[2] = {0, 0}, i, sum;
288
289 for (i = 1; dp < de; bsum[i^=1] += *dp++)
290 ;
291 sum = (bsum[0] << 8) + bsum[1];
292 sum = (sum >> 16) + (sum & 0xffff);
293 return ~(sum + (sum >> 16));
294 }
295
296 static void
297 putsum(uint8_t *data, uint32_t n, uint32_t sloc, uint32_t css, uint32_t cse)
298 {
299 if (cse && cse < n)
300 n = cse + 1;
301 if (sloc < n-1)
302 cpu_to_be16wu((uint16_t *)(data + sloc),
303 do_cksum(data + css, data + n));
304 }
305
306 static void
307 xmit_seg(E1000State *s)
308 {
309 uint16_t len, *sp;
310 unsigned int frames = s->tx.tso_frames, css, sofar, n;
311 struct e1000_tx *tp = &s->tx;
312
313 if (tp->tse) {
314 css = tp->ipcss;
315 DBGOUT(TXSUM, "frames %d size %d ipcss %d\n",
316 frames, tp->size, css);
317 if (tp->ip) { // IPv4
318 cpu_to_be16wu((uint16_t *)(tp->data+css+2),
319 tp->size - css);
320 cpu_to_be16wu((uint16_t *)(tp->data+css+4),
321 be16_to_cpup((uint16_t *)(tp->data+css+4))+frames);
322 } else // IPv6
323 cpu_to_be16wu((uint16_t *)(tp->data+css+4),
324 tp->size - css);
325 css = tp->tucss;
326 len = tp->size - css;
327 DBGOUT(TXSUM, "tcp %d tucss %d len %d\n", tp->tcp, css, len);
328 if (tp->tcp) {
329 sofar = frames * tp->mss;
330 cpu_to_be32wu((uint32_t *)(tp->data+css+4), // seq
331 be32_to_cpup((uint32_t *)(tp->data+css+4))+sofar);
332 if (tp->paylen - sofar > tp->mss)
333 tp->data[css + 13] &= ~9; // PSH, FIN
334 } else // UDP
335 cpu_to_be16wu((uint16_t *)(tp->data+css+4), len);
336 if (tp->sum_needed & E1000_TXD_POPTS_TXSM) {
337 // add pseudo-header length before checksum calculation
338 sp = (uint16_t *)(tp->data + tp->tucso);
339 cpu_to_be16wu(sp, be16_to_cpup(sp) + len);
340 }
341 tp->tso_frames++;
342 }
343
344 if (tp->sum_needed & E1000_TXD_POPTS_TXSM)
345 putsum(tp->data, tp->size, tp->tucso, tp->tucss, tp->tucse);
346 if (tp->sum_needed & E1000_TXD_POPTS_IXSM)
347 putsum(tp->data, tp->size, tp->ipcso, tp->ipcss, tp->ipcse);
348 qemu_send_packet(s->vc, tp->data, tp->size);
349 s->mac_reg[TPT]++;
350 s->mac_reg[GPTC]++;
351 n = s->mac_reg[TOTL];
352 if ((s->mac_reg[TOTL] += s->tx.size) < n)
353 s->mac_reg[TOTH]++;
354 }
355
356 static void
357 process_tx_desc(E1000State *s, struct e1000_tx_desc *dp)
358 {
359 uint32_t txd_lower = le32_to_cpu(dp->lower.data);
360 uint32_t dtype = txd_lower & (E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D);
361 unsigned int split_size = txd_lower & 0xffff, bytes, sz, op;
362 unsigned int msh = 0xfffff, hdr = 0;
363 uint64_t addr;
364 struct e1000_context_desc *xp = (struct e1000_context_desc *)dp;
365 struct e1000_tx *tp = &s->tx;
366
367 if (dtype == E1000_TXD_CMD_DEXT) { // context descriptor
368 op = le32_to_cpu(xp->cmd_and_length);
369 tp->ipcss = xp->lower_setup.ip_fields.ipcss;
370 tp->ipcso = xp->lower_setup.ip_fields.ipcso;
371 tp->ipcse = le16_to_cpu(xp->lower_setup.ip_fields.ipcse);
372 tp->tucss = xp->upper_setup.tcp_fields.tucss;
373 tp->tucso = xp->upper_setup.tcp_fields.tucso;
374 tp->tucse = le16_to_cpu(xp->upper_setup.tcp_fields.tucse);
375 tp->paylen = op & 0xfffff;
376 tp->hdr_len = xp->tcp_seg_setup.fields.hdr_len;
377 tp->mss = le16_to_cpu(xp->tcp_seg_setup.fields.mss);
378 tp->ip = (op & E1000_TXD_CMD_IP) ? 1 : 0;
379 tp->tcp = (op & E1000_TXD_CMD_TCP) ? 1 : 0;
380 tp->tse = (op & E1000_TXD_CMD_TSE) ? 1 : 0;
381 tp->tso_frames = 0;
382 if (tp->tucso == 0) { // this is probably wrong
383 DBGOUT(TXSUM, "TCP/UDP: cso 0!\n");
384 tp->tucso = tp->tucss + (tp->tcp ? 16 : 6);
385 }
386 return;
387 } else if (dtype == (E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D))
388 tp->sum_needed = le32_to_cpu(dp->upper.data) >> 8;
389
390 addr = le64_to_cpu(dp->buffer_addr);
391 if (tp->tse) {
392 hdr = tp->hdr_len;
393 msh = hdr + tp->mss;
394 }
395 do {
396 bytes = split_size;
397 if (tp->size + bytes > msh)
398 bytes = msh - tp->size;
399 cpu_physical_memory_read(addr, tp->data + tp->size, bytes);
400 if ((sz = tp->size + bytes) >= hdr && tp->size < hdr)
401 memmove(tp->header, tp->data, hdr);
402 tp->size = sz;
403 addr += bytes;
404 if (sz == msh) {
405 xmit_seg(s);
406 memmove(tp->data, tp->header, hdr);
407 tp->size = hdr;
408 }
409 } while (split_size -= bytes);
410
411 if (!(txd_lower & E1000_TXD_CMD_EOP))
412 return;
413 if (tp->size > hdr)
414 xmit_seg(s);
415 tp->tso_frames = 0;
416 tp->sum_needed = 0;
417 tp->size = 0;
418 }
419
420 static uint32_t
421 txdesc_writeback(target_phys_addr_t base, struct e1000_tx_desc *dp)
422 {
423 uint32_t txd_upper, txd_lower = le32_to_cpu(dp->lower.data);
424
425 if (!(txd_lower & (E1000_TXD_CMD_RS|E1000_TXD_CMD_RPS)))
426 return 0;
427 txd_upper = (le32_to_cpu(dp->upper.data) | E1000_TXD_STAT_DD) &
428 ~(E1000_TXD_STAT_EC | E1000_TXD_STAT_LC | E1000_TXD_STAT_TU);
429 dp->upper.data = cpu_to_le32(txd_upper);
430 cpu_physical_memory_write(base + ((char *)&dp->upper - (char *)dp),
431 (void *)&dp->upper, sizeof(dp->upper));
432 return E1000_ICR_TXDW;
433 }
434
435 static void
436 start_xmit(E1000State *s)
437 {
438 target_phys_addr_t base;
439 struct e1000_tx_desc desc;
440 uint32_t tdh_start = s->mac_reg[TDH], cause = E1000_ICS_TXQE;
441
442 if (!(s->mac_reg[TCTL] & E1000_TCTL_EN)) {
443 DBGOUT(TX, "tx disabled\n");
444 return;
445 }
446
447 while (s->mac_reg[TDH] != s->mac_reg[TDT]) {
448 base = ((uint64_t)s->mac_reg[TDBAH] << 32) + s->mac_reg[TDBAL] +
449 sizeof(struct e1000_tx_desc) * s->mac_reg[TDH];
450 cpu_physical_memory_read(base, (void *)&desc, sizeof(desc));
451
452 DBGOUT(TX, "index %d: %p : %x %x\n", s->mac_reg[TDH],
453 (void *)desc.buffer_addr, desc.lower.data,
454 desc.upper.data);
455
456 process_tx_desc(s, &desc);
457 cause |= txdesc_writeback(base, &desc);
458
459 if (++s->mac_reg[TDH] * sizeof(desc) >= s->mac_reg[TDLEN])
460 s->mac_reg[TDH] = 0;
461 /*
462 * the following could happen only if guest sw assigns
463 * bogus values to TDT/TDLEN.
464 * there's nothing too intelligent we could do about this.
465 */
466 if (s->mac_reg[TDH] == tdh_start) {
467 DBGOUT(TXERR, "TDH wraparound @%x, TDT %x, TDLEN %x\n",
468 tdh_start, s->mac_reg[TDT], s->mac_reg[TDLEN]);
469 break;
470 }
471 }
472 set_ics(s, 0, cause);
473 }
474
475 static int
476 receive_filter(E1000State *s, const uint8_t *buf, int size)
477 {
478 static uint8_t bcast[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
479 static int mta_shift[] = {4, 3, 2, 0};
480 uint32_t f, rctl = s->mac_reg[RCTL], ra[2], *rp;
481
482 if (rctl & E1000_RCTL_UPE) // promiscuous
483 return 1;
484
485 if ((buf[0] & 1) && (rctl & E1000_RCTL_MPE)) // promiscuous mcast
486 return 1;
487
488 if ((rctl & E1000_RCTL_BAM) && !memcmp(buf, bcast, sizeof bcast))
489 return 1;
490
491 for (rp = s->mac_reg + RA; rp < s->mac_reg + RA + 32; rp += 2) {
492 if (!(rp[1] & E1000_RAH_AV))
493 continue;
494 ra[0] = cpu_to_le32(rp[0]);
495 ra[1] = cpu_to_le32(rp[1]);
496 if (!memcmp(buf, (uint8_t *)ra, 6)) {
497 DBGOUT(RXFILTER,
498 "unicast match[%d]: %02x:%02x:%02x:%02x:%02x:%02x\n",
499 (int)(rp - s->mac_reg - RA)/2,
500 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
501 return 1;
502 }
503 }
504 DBGOUT(RXFILTER, "unicast mismatch: %02x:%02x:%02x:%02x:%02x:%02x\n",
505 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
506
507 f = mta_shift[(rctl >> E1000_RCTL_MO_SHIFT) & 3];
508 f = (((buf[5] << 8) | buf[4]) >> f) & 0xfff;
509 if (s->mac_reg[MTA + (f >> 5)] & (1 << (f & 0x1f)))
510 return 1;
511 DBGOUT(RXFILTER,
512 "dropping, inexact filter mismatch: %02x:%02x:%02x:%02x:%02x:%02x MO %d MTA[%d] %x\n",
513 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5],
514 (rctl >> E1000_RCTL_MO_SHIFT) & 3, f >> 5,
515 s->mac_reg[MTA + (f >> 5)]);
516
517 return 0;
518 }
519
520 static int
521 e1000_can_receive(void *opaque)
522 {
523 E1000State *s = opaque;
524
525 return (!(s->mac_reg[RCTL] & E1000_RCTL_EN) ||
526 s->mac_reg[RDH] != s->mac_reg[RDT]);
527 }
528
529 static void
530 e1000_receive(void *opaque, const uint8_t *buf, int size)
531 {
532 E1000State *s = opaque;
533 struct e1000_rx_desc desc;
534 target_phys_addr_t base;
535 unsigned int n, rdt;
536 uint32_t rdh_start;
537
538 if (!(s->mac_reg[RCTL] & E1000_RCTL_EN))
539 return;
540
541 if (size > s->rxbuf_size) {
542 DBGOUT(RX, "packet too large for buffers (%d > %d)\n", size,
543 s->rxbuf_size);
544 return;
545 }
546
547 if (!receive_filter(s, buf, size))
548 return;
549
550 rdh_start = s->mac_reg[RDH];
551 size += 4; // for the header
552 do {
553 if (s->mac_reg[RDH] == s->mac_reg[RDT] && s->check_rxov) {
554 set_ics(s, 0, E1000_ICS_RXO);
555 return;
556 }
557 base = ((uint64_t)s->mac_reg[RDBAH] << 32) + s->mac_reg[RDBAL] +
558 sizeof(desc) * s->mac_reg[RDH];
559 cpu_physical_memory_read(base, (void *)&desc, sizeof(desc));
560 desc.status |= E1000_RXD_STAT_DD;
561 if (desc.buffer_addr) {
562 cpu_physical_memory_write(le64_to_cpu(desc.buffer_addr),
563 (void *)buf, size);
564 desc.length = cpu_to_le16(size);
565 desc.status |= E1000_RXD_STAT_EOP|E1000_RXD_STAT_IXSM;
566 } else // as per intel docs; skip descriptors with null buf addr
567 DBGOUT(RX, "Null RX descriptor!!\n");
568 cpu_physical_memory_write(base, (void *)&desc, sizeof(desc));
569
570 if (++s->mac_reg[RDH] * sizeof(desc) >= s->mac_reg[RDLEN])
571 s->mac_reg[RDH] = 0;
572 s->check_rxov = 1;
573 /* see comment in start_xmit; same here */
574 if (s->mac_reg[RDH] == rdh_start) {
575 DBGOUT(RXERR, "RDH wraparound @%x, RDT %x, RDLEN %x\n",
576 rdh_start, s->mac_reg[RDT], s->mac_reg[RDLEN]);
577 set_ics(s, 0, E1000_ICS_RXO);
578 return;
579 }
580 } while (desc.buffer_addr == 0);
581
582 s->mac_reg[GPRC]++;
583 s->mac_reg[TPR]++;
584 n = s->mac_reg[TORL];
585 if ((s->mac_reg[TORL] += size) < n)
586 s->mac_reg[TORH]++;
587
588 n = E1000_ICS_RXT0;
589 if ((rdt = s->mac_reg[RDT]) < s->mac_reg[RDH])
590 rdt += s->mac_reg[RDLEN] / sizeof(desc);
591 if (((rdt - s->mac_reg[RDH]) * sizeof(desc)) << s->rxbuf_min_shift >=
592 s->mac_reg[RDLEN])
593 n |= E1000_ICS_RXDMT0;
594
595 set_ics(s, 0, n);
596 }
597
598 static uint32_t
599 mac_readreg(E1000State *s, int index)
600 {
601 return s->mac_reg[index];
602 }
603
604 static uint32_t
605 mac_icr_read(E1000State *s, int index)
606 {
607 uint32_t ret = s->mac_reg[ICR];
608
609 DBGOUT(INTERRUPT, "ICR read: %x\n", ret);
610 set_interrupt_cause(s, 0, 0);
611 return ret;
612 }
613
614 static uint32_t
615 mac_read_clr4(E1000State *s, int index)
616 {
617 uint32_t ret = s->mac_reg[index];
618
619 s->mac_reg[index] = 0;
620 return ret;
621 }
622
623 static uint32_t
624 mac_read_clr8(E1000State *s, int index)
625 {
626 uint32_t ret = s->mac_reg[index];
627
628 s->mac_reg[index] = 0;
629 s->mac_reg[index-1] = 0;
630 return ret;
631 }
632
633 static void
634 mac_writereg(E1000State *s, int index, uint32_t val)
635 {
636 s->mac_reg[index] = val;
637 }
638
639 static void
640 set_rdt(E1000State *s, int index, uint32_t val)
641 {
642 s->check_rxov = 0;
643 s->mac_reg[index] = val & 0xffff;
644 }
645
646 static void
647 set_16bit(E1000State *s, int index, uint32_t val)
648 {
649 s->mac_reg[index] = val & 0xffff;
650 }
651
652 static void
653 set_dlen(E1000State *s, int index, uint32_t val)
654 {
655 s->mac_reg[index] = val & 0xfff80;
656 }
657
658 static void
659 set_tctl(E1000State *s, int index, uint32_t val)
660 {
661 s->mac_reg[index] = val;
662 s->mac_reg[TDT] &= 0xffff;
663 start_xmit(s);
664 }
665
666 static void
667 set_icr(E1000State *s, int index, uint32_t val)
668 {
669 DBGOUT(INTERRUPT, "set_icr %x\n", val);
670 set_interrupt_cause(s, 0, s->mac_reg[ICR] & ~val);
671 }
672
673 static void
674 set_imc(E1000State *s, int index, uint32_t val)
675 {
676 s->mac_reg[IMS] &= ~val;
677 set_ics(s, 0, 0);
678 }
679
680 static void
681 set_ims(E1000State *s, int index, uint32_t val)
682 {
683 s->mac_reg[IMS] |= val;
684 set_ics(s, 0, 0);
685 }
686
687 #define getreg(x) [x] = mac_readreg
688 static uint32_t (*macreg_readops[])(E1000State *, int) = {
689 getreg(PBA), getreg(RCTL), getreg(TDH), getreg(TXDCTL),
690 getreg(WUFC), getreg(TDT), getreg(CTRL), getreg(LEDCTL),
691 getreg(MANC), getreg(MDIC), getreg(SWSM), getreg(STATUS),
692 getreg(TORL), getreg(TOTL), getreg(IMS), getreg(TCTL),
693 getreg(RDH), getreg(RDT),
694
695 [TOTH] = mac_read_clr8, [TORH] = mac_read_clr8, [GPRC] = mac_read_clr4,
696 [GPTC] = mac_read_clr4, [TPR] = mac_read_clr4, [TPT] = mac_read_clr4,
697 [ICR] = mac_icr_read, [EECD] = get_eecd, [EERD] = flash_eerd_read,
698 [CRCERRS ... MPC] = &mac_readreg,
699 [RA ... RA+31] = &mac_readreg,
700 [MTA ... MTA+127] = &mac_readreg,
701 };
702 enum { NREADOPS = sizeof(macreg_readops) / sizeof(*macreg_readops) };
703
704 #define putreg(x) [x] = mac_writereg
705 static void (*macreg_writeops[])(E1000State *, int, uint32_t) = {
706 putreg(PBA), putreg(EERD), putreg(SWSM), putreg(WUFC),
707 putreg(TDBAL), putreg(TDBAH), putreg(TXDCTL), putreg(RDBAH),
708 putreg(RDBAL), putreg(LEDCTL),
709 [TDLEN] = set_dlen, [RDLEN] = set_dlen, [TCTL] = set_tctl,
710 [TDT] = set_tctl, [MDIC] = set_mdic, [ICS] = set_ics,
711 [TDH] = set_16bit, [RDH] = set_16bit, [RDT] = set_rdt,
712 [IMC] = set_imc, [IMS] = set_ims, [ICR] = set_icr,
713 [EECD] = set_eecd, [RCTL] = set_rx_control,
714 [RA ... RA+31] = &mac_writereg,
715 [MTA ... MTA+127] = &mac_writereg,
716 };
717 enum { NWRITEOPS = sizeof(macreg_writeops) / sizeof(*macreg_writeops) };
718
719 static void
720 e1000_mmio_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
721 {
722 E1000State *s = opaque;
723 unsigned int index = ((addr - s->mmio_base) & 0x1ffff) >> 2;
724
725 if (index < NWRITEOPS && macreg_writeops[index])
726 macreg_writeops[index](s, index, le32_to_cpu(val));
727 else if (index < NREADOPS && macreg_readops[index])
728 DBGOUT(MMIO, "e1000_mmio_writel RO %x: 0x%04x\n", index<<2, val);
729 else
730 DBGOUT(UNKNOWN, "MMIO unknown write addr=0x%08x,val=0x%08x\n",
731 index<<2, val);
732 }
733
734 static void
735 e1000_mmio_writew(void *opaque, target_phys_addr_t addr, uint32_t val)
736 {
737 // emulate hw without byte enables: no RMW
738 e1000_mmio_writel(opaque, addr & ~3,
739 cpu_to_le32(le16_to_cpu(val & 0xffff) << (8*(addr & 3))));
740 }
741
742 static void
743 e1000_mmio_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
744 {
745 // emulate hw without byte enables: no RMW
746 e1000_mmio_writel(opaque, addr & ~3,
747 cpu_to_le32((val & 0xff) << (8*(addr & 3))));
748 }
749
750 static uint32_t
751 e1000_mmio_readl(void *opaque, target_phys_addr_t addr)
752 {
753 E1000State *s = opaque;
754 unsigned int index = ((addr - s->mmio_base) & 0x1ffff) >> 2;
755
756 if (index < NREADOPS && macreg_readops[index])
757 return cpu_to_le32(macreg_readops[index](s, index));
758 DBGOUT(UNKNOWN, "MMIO unknown read addr=0x%08x\n", index<<2);
759 return 0;
760 }
761
762 static uint32_t
763 e1000_mmio_readb(void *opaque, target_phys_addr_t addr)
764 {
765 return (le32_to_cpu(e1000_mmio_readl(opaque, addr & ~3)) >>
766 (8 * (addr & 3))) & 0xff;
767 }
768
769 static uint32_t
770 e1000_mmio_readw(void *opaque, target_phys_addr_t addr)
771 {
772 return cpu_to_le16((le32_to_cpu(e1000_mmio_readl(opaque, addr & ~3)) >>
773 (8 * (addr & 3))) & 0xffff);
774 }
775
776 int mac_regtosave[] = {
777 CTRL, EECD, EERD, GPRC, GPTC, ICR, ICS, IMC, IMS,
778 LEDCTL, MANC, MDIC, MPC, PBA, RCTL, RDBAH, RDBAL, RDH,
779 RDLEN, RDT, STATUS, SWSM, TCTL, TDBAH, TDBAL, TDH, TDLEN,
780 TDT, TORH, TORL, TOTH, TOTL, TPR, TPT, TXDCTL, WUFC,
781 };
782 enum { MAC_NSAVE = sizeof mac_regtosave/sizeof *mac_regtosave };
783
784 struct {
785 int size;
786 int array0;
787 } mac_regarraystosave[] = { {32, RA}, {128, MTA} };
788 enum { MAC_NARRAYS = sizeof mac_regarraystosave/sizeof *mac_regarraystosave };
789
790 static void
791 nic_save(QEMUFile *f, void *opaque)
792 {
793 E1000State *s = (E1000State *)opaque;
794 int i, j;
795
796 pci_device_save(&s->dev, f);
797 qemu_put_be32s(f, &s->instance);
798 qemu_put_be32s(f, &s->mmio_base);
799 qemu_put_be32s(f, &s->rxbuf_size);
800 qemu_put_be32s(f, &s->rxbuf_min_shift);
801 qemu_put_be32s(f, &s->eecd_state.val_in);
802 qemu_put_be16s(f, &s->eecd_state.bitnum_in);
803 qemu_put_be16s(f, &s->eecd_state.bitnum_out);
804 qemu_put_be16s(f, &s->eecd_state.reading);
805 qemu_put_be32s(f, &s->eecd_state.old_eecd);
806 qemu_put_8s(f, &s->tx.ipcss);
807 qemu_put_8s(f, &s->tx.ipcso);
808 qemu_put_be16s(f, &s->tx.ipcse);
809 qemu_put_8s(f, &s->tx.tucss);
810 qemu_put_8s(f, &s->tx.tucso);
811 qemu_put_be16s(f, &s->tx.tucse);
812 qemu_put_be32s(f, &s->tx.paylen);
813 qemu_put_8s(f, &s->tx.hdr_len);
814 qemu_put_be16s(f, &s->tx.mss);
815 qemu_put_be16s(f, &s->tx.size);
816 qemu_put_be16s(f, &s->tx.tso_frames);
817 qemu_put_8s(f, &s->tx.sum_needed);
818 qemu_put_8s(f, &s->tx.ip);
819 qemu_put_8s(f, &s->tx.tcp);
820 qemu_put_buffer(f, s->tx.header, sizeof s->tx.header);
821 qemu_put_buffer(f, s->tx.data, sizeof s->tx.data);
822 for (i = 0; i < 64; i++)
823 qemu_put_be16s(f, s->eeprom_data + i);
824 for (i = 0; i < 0x20; i++)
825 qemu_put_be16s(f, s->phy_reg + i);
826 for (i = 0; i < MAC_NSAVE; i++)
827 qemu_put_be32s(f, s->mac_reg + mac_regtosave[i]);
828 for (i = 0; i < MAC_NARRAYS; i++)
829 for (j = 0; j < mac_regarraystosave[i].size; j++)
830 qemu_put_be32s(f,
831 s->mac_reg + mac_regarraystosave[i].array0 + j);
832 }
833
834 static int
835 nic_load(QEMUFile *f, void *opaque, int version_id)
836 {
837 E1000State *s = (E1000State *)opaque;
838 int i, j, ret;
839
840 if ((ret = pci_device_load(&s->dev, f)) < 0)
841 return ret;
842 qemu_get_be32s(f, &s->instance);
843 qemu_get_be32s(f, &s->mmio_base);
844 qemu_get_be32s(f, &s->rxbuf_size);
845 qemu_get_be32s(f, &s->rxbuf_min_shift);
846 qemu_get_be32s(f, &s->eecd_state.val_in);
847 qemu_get_be16s(f, &s->eecd_state.bitnum_in);
848 qemu_get_be16s(f, &s->eecd_state.bitnum_out);
849 qemu_get_be16s(f, &s->eecd_state.reading);
850 qemu_get_be32s(f, &s->eecd_state.old_eecd);
851 qemu_get_8s(f, &s->tx.ipcss);
852 qemu_get_8s(f, &s->tx.ipcso);
853 qemu_get_be16s(f, &s->tx.ipcse);
854 qemu_get_8s(f, &s->tx.tucss);
855 qemu_get_8s(f, &s->tx.tucso);
856 qemu_get_be16s(f, &s->tx.tucse);
857 qemu_get_be32s(f, &s->tx.paylen);
858 qemu_get_8s(f, &s->tx.hdr_len);
859 qemu_get_be16s(f, &s->tx.mss);
860 qemu_get_be16s(f, &s->tx.size);
861 qemu_get_be16s(f, &s->tx.tso_frames);
862 qemu_get_8s(f, &s->tx.sum_needed);
863 qemu_get_8s(f, &s->tx.ip);
864 qemu_get_8s(f, &s->tx.tcp);
865 qemu_get_buffer(f, s->tx.header, sizeof s->tx.header);
866 qemu_get_buffer(f, s->tx.data, sizeof s->tx.data);
867 for (i = 0; i < 64; i++)
868 qemu_get_be16s(f, s->eeprom_data + i);
869 for (i = 0; i < 0x20; i++)
870 qemu_get_be16s(f, s->phy_reg + i);
871 for (i = 0; i < MAC_NSAVE; i++)
872 qemu_get_be32s(f, s->mac_reg + mac_regtosave[i]);
873 for (i = 0; i < MAC_NARRAYS; i++)
874 for (j = 0; j < mac_regarraystosave[i].size; j++)
875 qemu_get_be32s(f,
876 s->mac_reg + mac_regarraystosave[i].array0 + j);
877 return 0;
878 }
879
880 static uint16_t e1000_eeprom_template[64] = {
881 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000,
882 0x3000, 0x1000, 0x6403, E1000_DEVID, 0x8086, E1000_DEVID, 0x8086, 0x3040,
883 0x0008, 0x2000, 0x7e14, 0x0048, 0x1000, 0x00d8, 0x0000, 0x2700,
884 0x6cc9, 0x3150, 0x0722, 0x040b, 0x0984, 0x0000, 0xc000, 0x0706,
885 0x1008, 0x0000, 0x0f04, 0x7fff, 0x4d01, 0xffff, 0xffff, 0xffff,
886 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
887 0x0100, 0x4000, 0x121c, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
888 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000,
889 };
890
891 static uint16_t phy_reg_init[] = {
892 [PHY_CTRL] = 0x1140, [PHY_STATUS] = 0x796d, // link initially up
893 [PHY_ID1] = 0x141, [PHY_ID2] = PHY_ID2_INIT,
894 [PHY_1000T_CTRL] = 0x0e00, [M88E1000_PHY_SPEC_CTRL] = 0x360,
895 [M88E1000_EXT_PHY_SPEC_CTRL] = 0x0d60, [PHY_AUTONEG_ADV] = 0xde1,
896 [PHY_LP_ABILITY] = 0x1e0, [PHY_1000T_STATUS] = 0x3c00,
897 };
898
899 static uint32_t mac_reg_init[] = {
900 [PBA] = 0x00100030,
901 [LEDCTL] = 0x602,
902 [CTRL] = E1000_CTRL_SWDPIN2 | E1000_CTRL_SWDPIN0 |
903 E1000_CTRL_SPD_1000 | E1000_CTRL_SLU,
904 [STATUS] = 0x80000000 | E1000_STATUS_GIO_MASTER_ENABLE |
905 E1000_STATUS_ASDV | E1000_STATUS_MTXCKOK |
906 E1000_STATUS_SPEED_1000 | E1000_STATUS_FD |
907 E1000_STATUS_LU,
908 [MANC] = E1000_MANC_EN_MNG2HOST | E1000_MANC_RCV_TCO_EN |
909 E1000_MANC_ARP_EN | E1000_MANC_0298_EN |
910 E1000_MANC_RMCP_EN,
911 };
912
913 /* PCI interface */
914
915 static CPUWriteMemoryFunc *e1000_mmio_write[] = {
916 e1000_mmio_writeb, e1000_mmio_writew, e1000_mmio_writel
917 };
918
919 static CPUReadMemoryFunc *e1000_mmio_read[] = {
920 e1000_mmio_readb, e1000_mmio_readw, e1000_mmio_readl
921 };
922
923 static void
924 e1000_mmio_map(PCIDevice *pci_dev, int region_num,
925 uint32_t addr, uint32_t size, int type)
926 {
927 E1000State *d = (E1000State *)pci_dev;
928
929 DBGOUT(MMIO, "e1000_mmio_map addr=0x%08x 0x%08x\n", addr, size);
930
931 d->mmio_base = addr;
932 cpu_register_physical_memory(addr, PNPMMIO_SIZE, d->mmio_index);
933 }
934
935 void
936 pci_e1000_init(PCIBus *bus, NICInfo *nd, int devfn)
937 {
938 E1000State *d;
939 uint8_t *pci_conf;
940 static int instance;
941 uint16_t checksum = 0;
942 char *info_str = "e1000";
943 int i;
944
945 d = (E1000State *)pci_register_device(bus, "e1000",
946 sizeof(E1000State), devfn, NULL, NULL);
947
948 pci_conf = d->dev.config;
949 memset(pci_conf, 0, 256);
950
951 *(uint16_t *)(pci_conf+0x00) = cpu_to_le16(0x8086);
952 *(uint16_t *)(pci_conf+0x02) = cpu_to_le16(E1000_DEVID);
953 *(uint16_t *)(pci_conf+0x04) = cpu_to_le16(0x0407);
954 *(uint16_t *)(pci_conf+0x06) = cpu_to_le16(0x0010);
955 pci_conf[0x08] = 0x03;
956 pci_conf[0x0a] = 0x00; // ethernet network controller
957 pci_conf[0x0b] = 0x02;
958 pci_conf[0x0c] = 0x10;
959
960 pci_conf[0x3d] = 1; // interrupt pin 0
961
962 d->mmio_index = cpu_register_io_memory(0, e1000_mmio_read,
963 e1000_mmio_write, d);
964
965 pci_register_io_region((PCIDevice *)d, 0, PNPMMIO_SIZE,
966 PCI_ADDRESS_SPACE_MEM, e1000_mmio_map);
967
968 pci_register_io_region((PCIDevice *)d, 1, IOPORT_SIZE,
969 PCI_ADDRESS_SPACE_IO, ioport_map);
970
971 d->instance = instance++;
972
973 d->nd = nd;
974 memmove(d->eeprom_data, e1000_eeprom_template,
975 sizeof e1000_eeprom_template);
976 for (i = 0; i < 3; i++)
977 d->eeprom_data[i] = (nd->macaddr[2*i+1]<<8) | nd->macaddr[2*i];
978 for (i = 0; i < EEPROM_CHECKSUM_REG; i++)
979 checksum += d->eeprom_data[i];
980 checksum = (uint16_t) EEPROM_SUM - checksum;
981 d->eeprom_data[EEPROM_CHECKSUM_REG] = checksum;
982
983 memset(d->phy_reg, 0, sizeof d->phy_reg);
984 memmove(d->phy_reg, phy_reg_init, sizeof phy_reg_init);
985 memset(d->mac_reg, 0, sizeof d->mac_reg);
986 memmove(d->mac_reg, mac_reg_init, sizeof mac_reg_init);
987 d->rxbuf_min_shift = 1;
988 memset(&d->tx, 0, sizeof d->tx);
989
990 d->vc = qemu_new_vlan_client(nd->vlan, e1000_receive,
991 e1000_can_receive, d);
992
993 snprintf(d->vc->info_str, sizeof(d->vc->info_str),
994 "%s macaddr=%02x:%02x:%02x:%02x:%02x:%02x", info_str,
995 d->nd->macaddr[0], d->nd->macaddr[1], d->nd->macaddr[2],
996 d->nd->macaddr[3], d->nd->macaddr[4], d->nd->macaddr[5]);
997
998 register_savevm(info_str, d->instance, 1, nic_save, nic_load, d);
999 }