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