]> git.proxmox.com Git - mirror_qemu.git/blob - hw/net/xilinx_axienet.c
Include hw/hw.h exactly where needed
[mirror_qemu.git] / hw / net / xilinx_axienet.c
1 /*
2 * QEMU model of Xilinx AXI-Ethernet.
3 *
4 * Copyright (c) 2011 Edgar E. Iglesias.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
24
25 #include "qemu/osdep.h"
26 #include "hw/sysbus.h"
27 #include "qapi/error.h"
28 #include "qemu/log.h"
29 #include "qemu/module.h"
30 #include "net/net.h"
31 #include "net/checksum.h"
32
33 #include "hw/hw.h"
34 #include "hw/irq.h"
35 #include "hw/stream.h"
36
37 #define DPHY(x)
38
39 #define TYPE_XILINX_AXI_ENET "xlnx.axi-ethernet"
40 #define TYPE_XILINX_AXI_ENET_DATA_STREAM "xilinx-axienet-data-stream"
41 #define TYPE_XILINX_AXI_ENET_CONTROL_STREAM "xilinx-axienet-control-stream"
42
43 #define XILINX_AXI_ENET(obj) \
44 OBJECT_CHECK(XilinxAXIEnet, (obj), TYPE_XILINX_AXI_ENET)
45
46 #define XILINX_AXI_ENET_DATA_STREAM(obj) \
47 OBJECT_CHECK(XilinxAXIEnetStreamSlave, (obj),\
48 TYPE_XILINX_AXI_ENET_DATA_STREAM)
49
50 #define XILINX_AXI_ENET_CONTROL_STREAM(obj) \
51 OBJECT_CHECK(XilinxAXIEnetStreamSlave, (obj),\
52 TYPE_XILINX_AXI_ENET_CONTROL_STREAM)
53
54 /* Advertisement control register. */
55 #define ADVERTISE_10HALF 0x0020 /* Try for 10mbps half-duplex */
56 #define ADVERTISE_10FULL 0x0040 /* Try for 10mbps full-duplex */
57 #define ADVERTISE_100HALF 0x0080 /* Try for 100mbps half-duplex */
58 #define ADVERTISE_100FULL 0x0100 /* Try for 100mbps full-duplex */
59
60 #define CONTROL_PAYLOAD_WORDS 5
61 #define CONTROL_PAYLOAD_SIZE (CONTROL_PAYLOAD_WORDS * (sizeof(uint32_t)))
62
63 struct PHY {
64 uint32_t regs[32];
65
66 int link;
67
68 unsigned int (*read)(struct PHY *phy, unsigned int req);
69 void (*write)(struct PHY *phy, unsigned int req,
70 unsigned int data);
71 };
72
73 static unsigned int tdk_read(struct PHY *phy, unsigned int req)
74 {
75 int regnum;
76 unsigned r = 0;
77
78 regnum = req & 0x1f;
79
80 switch (regnum) {
81 case 1:
82 if (!phy->link) {
83 break;
84 }
85 /* MR1. */
86 /* Speeds and modes. */
87 r |= (1 << 13) | (1 << 14);
88 r |= (1 << 11) | (1 << 12);
89 r |= (1 << 5); /* Autoneg complete. */
90 r |= (1 << 3); /* Autoneg able. */
91 r |= (1 << 2); /* link. */
92 r |= (1 << 1); /* link. */
93 break;
94 case 5:
95 /* Link partner ability.
96 We are kind; always agree with whatever best mode
97 the guest advertises. */
98 r = 1 << 14; /* Success. */
99 /* Copy advertised modes. */
100 r |= phy->regs[4] & (15 << 5);
101 /* Autoneg support. */
102 r |= 1;
103 break;
104 case 17:
105 /* Marvell PHY on many xilinx boards. */
106 r = 0x8000; /* 1000Mb */
107 break;
108 case 18:
109 {
110 /* Diagnostics reg. */
111 int duplex = 0;
112 int speed_100 = 0;
113
114 if (!phy->link) {
115 break;
116 }
117
118 /* Are we advertising 100 half or 100 duplex ? */
119 speed_100 = !!(phy->regs[4] & ADVERTISE_100HALF);
120 speed_100 |= !!(phy->regs[4] & ADVERTISE_100FULL);
121
122 /* Are we advertising 10 duplex or 100 duplex ? */
123 duplex = !!(phy->regs[4] & ADVERTISE_100FULL);
124 duplex |= !!(phy->regs[4] & ADVERTISE_10FULL);
125 r = (speed_100 << 10) | (duplex << 11);
126 }
127 break;
128
129 default:
130 r = phy->regs[regnum];
131 break;
132 }
133 DPHY(qemu_log("\n%s %x = reg[%d]\n", __func__, r, regnum));
134 return r;
135 }
136
137 static void
138 tdk_write(struct PHY *phy, unsigned int req, unsigned int data)
139 {
140 int regnum;
141
142 regnum = req & 0x1f;
143 DPHY(qemu_log("%s reg[%d] = %x\n", __func__, regnum, data));
144 switch (regnum) {
145 default:
146 phy->regs[regnum] = data;
147 break;
148 }
149
150 /* Unconditionally clear regs[BMCR][BMCR_RESET] */
151 phy->regs[0] &= ~0x8000;
152 }
153
154 static void
155 tdk_init(struct PHY *phy)
156 {
157 phy->regs[0] = 0x3100;
158 /* PHY Id. */
159 phy->regs[2] = 0x0300;
160 phy->regs[3] = 0xe400;
161 /* Autonegotiation advertisement reg. */
162 phy->regs[4] = 0x01E1;
163 phy->link = 1;
164
165 phy->read = tdk_read;
166 phy->write = tdk_write;
167 }
168
169 struct MDIOBus {
170 /* bus. */
171 int mdc;
172 int mdio;
173
174 /* decoder. */
175 enum {
176 PREAMBLE,
177 SOF,
178 OPC,
179 ADDR,
180 REQ,
181 TURNAROUND,
182 DATA
183 } state;
184 unsigned int drive;
185
186 unsigned int cnt;
187 unsigned int addr;
188 unsigned int opc;
189 unsigned int req;
190 unsigned int data;
191
192 struct PHY *devs[32];
193 };
194
195 static void
196 mdio_attach(struct MDIOBus *bus, struct PHY *phy, unsigned int addr)
197 {
198 bus->devs[addr & 0x1f] = phy;
199 }
200
201 #ifdef USE_THIS_DEAD_CODE
202 static void
203 mdio_detach(struct MDIOBus *bus, struct PHY *phy, unsigned int addr)
204 {
205 bus->devs[addr & 0x1f] = NULL;
206 }
207 #endif
208
209 static uint16_t mdio_read_req(struct MDIOBus *bus, unsigned int addr,
210 unsigned int reg)
211 {
212 struct PHY *phy;
213 uint16_t data;
214
215 phy = bus->devs[addr];
216 if (phy && phy->read) {
217 data = phy->read(phy, reg);
218 } else {
219 data = 0xffff;
220 }
221 DPHY(qemu_log("%s addr=%d reg=%d data=%x\n", __func__, addr, reg, data));
222 return data;
223 }
224
225 static void mdio_write_req(struct MDIOBus *bus, unsigned int addr,
226 unsigned int reg, uint16_t data)
227 {
228 struct PHY *phy;
229
230 DPHY(qemu_log("%s addr=%d reg=%d data=%x\n", __func__, addr, reg, data));
231 phy = bus->devs[addr];
232 if (phy && phy->write) {
233 phy->write(phy, reg, data);
234 }
235 }
236
237 #define DENET(x)
238
239 #define R_RAF (0x000 / 4)
240 enum {
241 RAF_MCAST_REJ = (1 << 1),
242 RAF_BCAST_REJ = (1 << 2),
243 RAF_EMCF_EN = (1 << 12),
244 RAF_NEWFUNC_EN = (1 << 11)
245 };
246
247 #define R_IS (0x00C / 4)
248 enum {
249 IS_HARD_ACCESS_COMPLETE = 1,
250 IS_AUTONEG = (1 << 1),
251 IS_RX_COMPLETE = (1 << 2),
252 IS_RX_REJECT = (1 << 3),
253 IS_TX_COMPLETE = (1 << 5),
254 IS_RX_DCM_LOCK = (1 << 6),
255 IS_MGM_RDY = (1 << 7),
256 IS_PHY_RST_DONE = (1 << 8),
257 };
258
259 #define R_IP (0x010 / 4)
260 #define R_IE (0x014 / 4)
261 #define R_UAWL (0x020 / 4)
262 #define R_UAWU (0x024 / 4)
263 #define R_PPST (0x030 / 4)
264 enum {
265 PPST_LINKSTATUS = (1 << 0),
266 PPST_PHY_LINKSTATUS = (1 << 7),
267 };
268
269 #define R_STATS_RX_BYTESL (0x200 / 4)
270 #define R_STATS_RX_BYTESH (0x204 / 4)
271 #define R_STATS_TX_BYTESL (0x208 / 4)
272 #define R_STATS_TX_BYTESH (0x20C / 4)
273 #define R_STATS_RXL (0x290 / 4)
274 #define R_STATS_RXH (0x294 / 4)
275 #define R_STATS_RX_BCASTL (0x2a0 / 4)
276 #define R_STATS_RX_BCASTH (0x2a4 / 4)
277 #define R_STATS_RX_MCASTL (0x2a8 / 4)
278 #define R_STATS_RX_MCASTH (0x2ac / 4)
279
280 #define R_RCW0 (0x400 / 4)
281 #define R_RCW1 (0x404 / 4)
282 enum {
283 RCW1_VLAN = (1 << 27),
284 RCW1_RX = (1 << 28),
285 RCW1_FCS = (1 << 29),
286 RCW1_JUM = (1 << 30),
287 RCW1_RST = (1 << 31),
288 };
289
290 #define R_TC (0x408 / 4)
291 enum {
292 TC_VLAN = (1 << 27),
293 TC_TX = (1 << 28),
294 TC_FCS = (1 << 29),
295 TC_JUM = (1 << 30),
296 TC_RST = (1 << 31),
297 };
298
299 #define R_EMMC (0x410 / 4)
300 enum {
301 EMMC_LINKSPEED_10MB = (0 << 30),
302 EMMC_LINKSPEED_100MB = (1 << 30),
303 EMMC_LINKSPEED_1000MB = (2 << 30),
304 };
305
306 #define R_PHYC (0x414 / 4)
307
308 #define R_MC (0x500 / 4)
309 #define MC_EN (1 << 6)
310
311 #define R_MCR (0x504 / 4)
312 #define R_MWD (0x508 / 4)
313 #define R_MRD (0x50c / 4)
314 #define R_MIS (0x600 / 4)
315 #define R_MIP (0x620 / 4)
316 #define R_MIE (0x640 / 4)
317 #define R_MIC (0x640 / 4)
318
319 #define R_UAW0 (0x700 / 4)
320 #define R_UAW1 (0x704 / 4)
321 #define R_FMI (0x708 / 4)
322 #define R_AF0 (0x710 / 4)
323 #define R_AF1 (0x714 / 4)
324 #define R_MAX (0x34 / 4)
325
326 /* Indirect registers. */
327 struct TEMAC {
328 struct MDIOBus mdio_bus;
329 struct PHY phy;
330
331 void *parent;
332 };
333
334 typedef struct XilinxAXIEnetStreamSlave XilinxAXIEnetStreamSlave;
335 typedef struct XilinxAXIEnet XilinxAXIEnet;
336
337 struct XilinxAXIEnetStreamSlave {
338 Object parent;
339
340 struct XilinxAXIEnet *enet;
341 } ;
342
343 struct XilinxAXIEnet {
344 SysBusDevice busdev;
345 MemoryRegion iomem;
346 qemu_irq irq;
347 StreamSlave *tx_data_dev;
348 StreamSlave *tx_control_dev;
349 XilinxAXIEnetStreamSlave rx_data_dev;
350 XilinxAXIEnetStreamSlave rx_control_dev;
351 NICState *nic;
352 NICConf conf;
353
354
355 uint32_t c_rxmem;
356 uint32_t c_txmem;
357 uint32_t c_phyaddr;
358
359 struct TEMAC TEMAC;
360
361 /* MII regs. */
362 union {
363 uint32_t regs[4];
364 struct {
365 uint32_t mc;
366 uint32_t mcr;
367 uint32_t mwd;
368 uint32_t mrd;
369 };
370 } mii;
371
372 struct {
373 uint64_t rx_bytes;
374 uint64_t tx_bytes;
375
376 uint64_t rx;
377 uint64_t rx_bcast;
378 uint64_t rx_mcast;
379 } stats;
380
381 /* Receive configuration words. */
382 uint32_t rcw[2];
383 /* Transmit config. */
384 uint32_t tc;
385 uint32_t emmc;
386 uint32_t phyc;
387
388 /* Unicast Address Word. */
389 uint32_t uaw[2];
390 /* Unicast address filter used with extended mcast. */
391 uint32_t ext_uaw[2];
392 uint32_t fmi;
393
394 uint32_t regs[R_MAX];
395
396 /* Multicast filter addrs. */
397 uint32_t maddr[4][2];
398 /* 32K x 1 lookup filter. */
399 uint32_t ext_mtable[1024];
400
401 uint32_t hdr[CONTROL_PAYLOAD_WORDS];
402
403 uint8_t *rxmem;
404 uint32_t rxsize;
405 uint32_t rxpos;
406
407 uint8_t rxapp[CONTROL_PAYLOAD_SIZE];
408 uint32_t rxappsize;
409
410 /* Whether axienet_eth_rx_notify should flush incoming queue. */
411 bool need_flush;
412 };
413
414 static void axienet_rx_reset(XilinxAXIEnet *s)
415 {
416 s->rcw[1] = RCW1_JUM | RCW1_FCS | RCW1_RX | RCW1_VLAN;
417 }
418
419 static void axienet_tx_reset(XilinxAXIEnet *s)
420 {
421 s->tc = TC_JUM | TC_TX | TC_VLAN;
422 }
423
424 static inline int axienet_rx_resetting(XilinxAXIEnet *s)
425 {
426 return s->rcw[1] & RCW1_RST;
427 }
428
429 static inline int axienet_rx_enabled(XilinxAXIEnet *s)
430 {
431 return s->rcw[1] & RCW1_RX;
432 }
433
434 static inline int axienet_extmcf_enabled(XilinxAXIEnet *s)
435 {
436 return !!(s->regs[R_RAF] & RAF_EMCF_EN);
437 }
438
439 static inline int axienet_newfunc_enabled(XilinxAXIEnet *s)
440 {
441 return !!(s->regs[R_RAF] & RAF_NEWFUNC_EN);
442 }
443
444 static void xilinx_axienet_reset(DeviceState *d)
445 {
446 XilinxAXIEnet *s = XILINX_AXI_ENET(d);
447
448 axienet_rx_reset(s);
449 axienet_tx_reset(s);
450
451 s->regs[R_PPST] = PPST_LINKSTATUS | PPST_PHY_LINKSTATUS;
452 s->regs[R_IS] = IS_AUTONEG | IS_RX_DCM_LOCK | IS_MGM_RDY | IS_PHY_RST_DONE;
453
454 s->emmc = EMMC_LINKSPEED_100MB;
455 }
456
457 static void enet_update_irq(XilinxAXIEnet *s)
458 {
459 s->regs[R_IP] = s->regs[R_IS] & s->regs[R_IE];
460 qemu_set_irq(s->irq, !!s->regs[R_IP]);
461 }
462
463 static uint64_t enet_read(void *opaque, hwaddr addr, unsigned size)
464 {
465 XilinxAXIEnet *s = opaque;
466 uint32_t r = 0;
467 addr >>= 2;
468
469 switch (addr) {
470 case R_RCW0:
471 case R_RCW1:
472 r = s->rcw[addr & 1];
473 break;
474
475 case R_TC:
476 r = s->tc;
477 break;
478
479 case R_EMMC:
480 r = s->emmc;
481 break;
482
483 case R_PHYC:
484 r = s->phyc;
485 break;
486
487 case R_MCR:
488 r = s->mii.regs[addr & 3] | (1 << 7); /* Always ready. */
489 break;
490
491 case R_STATS_RX_BYTESL:
492 case R_STATS_RX_BYTESH:
493 r = s->stats.rx_bytes >> (32 * (addr & 1));
494 break;
495
496 case R_STATS_TX_BYTESL:
497 case R_STATS_TX_BYTESH:
498 r = s->stats.tx_bytes >> (32 * (addr & 1));
499 break;
500
501 case R_STATS_RXL:
502 case R_STATS_RXH:
503 r = s->stats.rx >> (32 * (addr & 1));
504 break;
505 case R_STATS_RX_BCASTL:
506 case R_STATS_RX_BCASTH:
507 r = s->stats.rx_bcast >> (32 * (addr & 1));
508 break;
509 case R_STATS_RX_MCASTL:
510 case R_STATS_RX_MCASTH:
511 r = s->stats.rx_mcast >> (32 * (addr & 1));
512 break;
513
514 case R_MC:
515 case R_MWD:
516 case R_MRD:
517 r = s->mii.regs[addr & 3];
518 break;
519
520 case R_UAW0:
521 case R_UAW1:
522 r = s->uaw[addr & 1];
523 break;
524
525 case R_UAWU:
526 case R_UAWL:
527 r = s->ext_uaw[addr & 1];
528 break;
529
530 case R_FMI:
531 r = s->fmi;
532 break;
533
534 case R_AF0:
535 case R_AF1:
536 r = s->maddr[s->fmi & 3][addr & 1];
537 break;
538
539 case 0x8000 ... 0x83ff:
540 r = s->ext_mtable[addr - 0x8000];
541 break;
542
543 default:
544 if (addr < ARRAY_SIZE(s->regs)) {
545 r = s->regs[addr];
546 }
547 DENET(qemu_log("%s addr=" TARGET_FMT_plx " v=%x\n",
548 __func__, addr * 4, r));
549 break;
550 }
551 return r;
552 }
553
554 static void enet_write(void *opaque, hwaddr addr,
555 uint64_t value, unsigned size)
556 {
557 XilinxAXIEnet *s = opaque;
558 struct TEMAC *t = &s->TEMAC;
559
560 addr >>= 2;
561 switch (addr) {
562 case R_RCW0:
563 case R_RCW1:
564 s->rcw[addr & 1] = value;
565 if ((addr & 1) && value & RCW1_RST) {
566 axienet_rx_reset(s);
567 } else {
568 qemu_flush_queued_packets(qemu_get_queue(s->nic));
569 }
570 break;
571
572 case R_TC:
573 s->tc = value;
574 if (value & TC_RST) {
575 axienet_tx_reset(s);
576 }
577 break;
578
579 case R_EMMC:
580 s->emmc = value;
581 break;
582
583 case R_PHYC:
584 s->phyc = value;
585 break;
586
587 case R_MC:
588 value &= ((1 << 7) - 1);
589
590 /* Enable the MII. */
591 if (value & MC_EN) {
592 unsigned int miiclkdiv = value & ((1 << 6) - 1);
593 if (!miiclkdiv) {
594 qemu_log("AXIENET: MDIO enabled but MDIOCLK is zero!\n");
595 }
596 }
597 s->mii.mc = value;
598 break;
599
600 case R_MCR: {
601 unsigned int phyaddr = (value >> 24) & 0x1f;
602 unsigned int regaddr = (value >> 16) & 0x1f;
603 unsigned int op = (value >> 14) & 3;
604 unsigned int initiate = (value >> 11) & 1;
605
606 if (initiate) {
607 if (op == 1) {
608 mdio_write_req(&t->mdio_bus, phyaddr, regaddr, s->mii.mwd);
609 } else if (op == 2) {
610 s->mii.mrd = mdio_read_req(&t->mdio_bus, phyaddr, regaddr);
611 } else {
612 qemu_log("AXIENET: invalid MDIOBus OP=%d\n", op);
613 }
614 }
615 s->mii.mcr = value;
616 break;
617 }
618
619 case R_MWD:
620 case R_MRD:
621 s->mii.regs[addr & 3] = value;
622 break;
623
624
625 case R_UAW0:
626 case R_UAW1:
627 s->uaw[addr & 1] = value;
628 break;
629
630 case R_UAWL:
631 case R_UAWU:
632 s->ext_uaw[addr & 1] = value;
633 break;
634
635 case R_FMI:
636 s->fmi = value;
637 break;
638
639 case R_AF0:
640 case R_AF1:
641 s->maddr[s->fmi & 3][addr & 1] = value;
642 break;
643
644 case R_IS:
645 s->regs[addr] &= ~value;
646 break;
647
648 case 0x8000 ... 0x83ff:
649 s->ext_mtable[addr - 0x8000] = value;
650 break;
651
652 default:
653 DENET(qemu_log("%s addr=" TARGET_FMT_plx " v=%x\n",
654 __func__, addr * 4, (unsigned)value));
655 if (addr < ARRAY_SIZE(s->regs)) {
656 s->regs[addr] = value;
657 }
658 break;
659 }
660 enet_update_irq(s);
661 }
662
663 static const MemoryRegionOps enet_ops = {
664 .read = enet_read,
665 .write = enet_write,
666 .endianness = DEVICE_LITTLE_ENDIAN,
667 };
668
669 static int eth_can_rx(XilinxAXIEnet *s)
670 {
671 /* RX enabled? */
672 return !s->rxsize && !axienet_rx_resetting(s) && axienet_rx_enabled(s);
673 }
674
675 static int enet_match_addr(const uint8_t *buf, uint32_t f0, uint32_t f1)
676 {
677 int match = 1;
678
679 if (memcmp(buf, &f0, 4)) {
680 match = 0;
681 }
682
683 if (buf[4] != (f1 & 0xff) || buf[5] != ((f1 >> 8) & 0xff)) {
684 match = 0;
685 }
686
687 return match;
688 }
689
690 static void axienet_eth_rx_notify(void *opaque)
691 {
692 XilinxAXIEnet *s = XILINX_AXI_ENET(opaque);
693
694 while (s->rxappsize && stream_can_push(s->tx_control_dev,
695 axienet_eth_rx_notify, s)) {
696 size_t ret = stream_push(s->tx_control_dev,
697 (void *)s->rxapp + CONTROL_PAYLOAD_SIZE
698 - s->rxappsize, s->rxappsize);
699 s->rxappsize -= ret;
700 }
701
702 while (s->rxsize && stream_can_push(s->tx_data_dev,
703 axienet_eth_rx_notify, s)) {
704 size_t ret = stream_push(s->tx_data_dev, (void *)s->rxmem + s->rxpos,
705 s->rxsize);
706 s->rxsize -= ret;
707 s->rxpos += ret;
708 if (!s->rxsize) {
709 s->regs[R_IS] |= IS_RX_COMPLETE;
710 if (s->need_flush) {
711 s->need_flush = false;
712 qemu_flush_queued_packets(qemu_get_queue(s->nic));
713 }
714 }
715 }
716 enet_update_irq(s);
717 }
718
719 static ssize_t eth_rx(NetClientState *nc, const uint8_t *buf, size_t size)
720 {
721 XilinxAXIEnet *s = qemu_get_nic_opaque(nc);
722 static const unsigned char sa_bcast[6] = {0xff, 0xff, 0xff,
723 0xff, 0xff, 0xff};
724 static const unsigned char sa_ipmcast[3] = {0x01, 0x00, 0x52};
725 uint32_t app[CONTROL_PAYLOAD_WORDS] = {0};
726 int promisc = s->fmi & (1 << 31);
727 int unicast, broadcast, multicast, ip_multicast = 0;
728 uint32_t csum32;
729 uint16_t csum16;
730 int i;
731
732 DENET(qemu_log("%s: %zd bytes\n", __func__, size));
733
734 if (!eth_can_rx(s)) {
735 s->need_flush = true;
736 return 0;
737 }
738
739 unicast = ~buf[0] & 0x1;
740 broadcast = memcmp(buf, sa_bcast, 6) == 0;
741 multicast = !unicast && !broadcast;
742 if (multicast && (memcmp(sa_ipmcast, buf, sizeof sa_ipmcast) == 0)) {
743 ip_multicast = 1;
744 }
745
746 /* Jumbo or vlan sizes ? */
747 if (!(s->rcw[1] & RCW1_JUM)) {
748 if (size > 1518 && size <= 1522 && !(s->rcw[1] & RCW1_VLAN)) {
749 return size;
750 }
751 }
752
753 /* Basic Address filters. If you want to use the extended filters
754 you'll generally have to place the ethernet mac into promiscuous mode
755 to avoid the basic filtering from dropping most frames. */
756 if (!promisc) {
757 if (unicast) {
758 if (!enet_match_addr(buf, s->uaw[0], s->uaw[1])) {
759 return size;
760 }
761 } else {
762 if (broadcast) {
763 /* Broadcast. */
764 if (s->regs[R_RAF] & RAF_BCAST_REJ) {
765 return size;
766 }
767 } else {
768 int drop = 1;
769
770 /* Multicast. */
771 if (s->regs[R_RAF] & RAF_MCAST_REJ) {
772 return size;
773 }
774
775 for (i = 0; i < 4; i++) {
776 if (enet_match_addr(buf, s->maddr[i][0], s->maddr[i][1])) {
777 drop = 0;
778 break;
779 }
780 }
781
782 if (drop) {
783 return size;
784 }
785 }
786 }
787 }
788
789 /* Extended mcast filtering enabled? */
790 if (axienet_newfunc_enabled(s) && axienet_extmcf_enabled(s)) {
791 if (unicast) {
792 if (!enet_match_addr(buf, s->ext_uaw[0], s->ext_uaw[1])) {
793 return size;
794 }
795 } else {
796 if (broadcast) {
797 /* Broadcast. ??? */
798 if (s->regs[R_RAF] & RAF_BCAST_REJ) {
799 return size;
800 }
801 } else {
802 int idx, bit;
803
804 /* Multicast. */
805 if (!memcmp(buf, sa_ipmcast, 3)) {
806 return size;
807 }
808
809 idx = (buf[4] & 0x7f) << 8;
810 idx |= buf[5];
811
812 bit = 1 << (idx & 0x1f);
813 idx >>= 5;
814
815 if (!(s->ext_mtable[idx] & bit)) {
816 return size;
817 }
818 }
819 }
820 }
821
822 if (size < 12) {
823 s->regs[R_IS] |= IS_RX_REJECT;
824 enet_update_irq(s);
825 return -1;
826 }
827
828 if (size > (s->c_rxmem - 4)) {
829 size = s->c_rxmem - 4;
830 }
831
832 memcpy(s->rxmem, buf, size);
833 memset(s->rxmem + size, 0, 4); /* Clear the FCS. */
834
835 if (s->rcw[1] & RCW1_FCS) {
836 size += 4; /* fcs is inband. */
837 }
838
839 app[0] = 5 << 28;
840 csum32 = net_checksum_add(size - 14, (uint8_t *)s->rxmem + 14);
841 /* Fold it once. */
842 csum32 = (csum32 & 0xffff) + (csum32 >> 16);
843 /* And twice to get rid of possible carries. */
844 csum16 = (csum32 & 0xffff) + (csum32 >> 16);
845 app[3] = csum16;
846 app[4] = size & 0xffff;
847
848 s->stats.rx_bytes += size;
849 s->stats.rx++;
850 if (multicast) {
851 s->stats.rx_mcast++;
852 app[2] |= 1 | (ip_multicast << 1);
853 } else if (broadcast) {
854 s->stats.rx_bcast++;
855 app[2] |= 1 << 3;
856 }
857
858 /* Good frame. */
859 app[2] |= 1 << 6;
860
861 s->rxsize = size;
862 s->rxpos = 0;
863 for (i = 0; i < ARRAY_SIZE(app); ++i) {
864 app[i] = cpu_to_le32(app[i]);
865 }
866 s->rxappsize = CONTROL_PAYLOAD_SIZE;
867 memcpy(s->rxapp, app, s->rxappsize);
868 axienet_eth_rx_notify(s);
869
870 enet_update_irq(s);
871 return size;
872 }
873
874 static size_t
875 xilinx_axienet_control_stream_push(StreamSlave *obj, uint8_t *buf, size_t len)
876 {
877 int i;
878 XilinxAXIEnetStreamSlave *cs = XILINX_AXI_ENET_CONTROL_STREAM(obj);
879 XilinxAXIEnet *s = cs->enet;
880
881 if (len != CONTROL_PAYLOAD_SIZE) {
882 hw_error("AXI Enet requires %d byte control stream payload\n",
883 (int)CONTROL_PAYLOAD_SIZE);
884 }
885
886 memcpy(s->hdr, buf, len);
887
888 for (i = 0; i < ARRAY_SIZE(s->hdr); ++i) {
889 s->hdr[i] = le32_to_cpu(s->hdr[i]);
890 }
891 return len;
892 }
893
894 static size_t
895 xilinx_axienet_data_stream_push(StreamSlave *obj, uint8_t *buf, size_t size)
896 {
897 XilinxAXIEnetStreamSlave *ds = XILINX_AXI_ENET_DATA_STREAM(obj);
898 XilinxAXIEnet *s = ds->enet;
899
900 /* TX enable ? */
901 if (!(s->tc & TC_TX)) {
902 return size;
903 }
904
905 /* Jumbo or vlan sizes ? */
906 if (!(s->tc & TC_JUM)) {
907 if (size > 1518 && size <= 1522 && !(s->tc & TC_VLAN)) {
908 return size;
909 }
910 }
911
912 if (s->hdr[0] & 1) {
913 unsigned int start_off = s->hdr[1] >> 16;
914 unsigned int write_off = s->hdr[1] & 0xffff;
915 uint32_t tmp_csum;
916 uint16_t csum;
917
918 tmp_csum = net_checksum_add(size - start_off,
919 (uint8_t *)buf + start_off);
920 /* Accumulate the seed. */
921 tmp_csum += s->hdr[2] & 0xffff;
922
923 /* Fold the 32bit partial checksum. */
924 csum = net_checksum_finish(tmp_csum);
925
926 /* Writeback. */
927 buf[write_off] = csum >> 8;
928 buf[write_off + 1] = csum & 0xff;
929 }
930
931 qemu_send_packet(qemu_get_queue(s->nic), buf, size);
932
933 s->stats.tx_bytes += size;
934 s->regs[R_IS] |= IS_TX_COMPLETE;
935 enet_update_irq(s);
936
937 return size;
938 }
939
940 static NetClientInfo net_xilinx_enet_info = {
941 .type = NET_CLIENT_DRIVER_NIC,
942 .size = sizeof(NICState),
943 .receive = eth_rx,
944 };
945
946 static void xilinx_enet_realize(DeviceState *dev, Error **errp)
947 {
948 XilinxAXIEnet *s = XILINX_AXI_ENET(dev);
949 XilinxAXIEnetStreamSlave *ds = XILINX_AXI_ENET_DATA_STREAM(&s->rx_data_dev);
950 XilinxAXIEnetStreamSlave *cs = XILINX_AXI_ENET_CONTROL_STREAM(
951 &s->rx_control_dev);
952 Error *local_err = NULL;
953
954 object_property_add_link(OBJECT(ds), "enet", "xlnx.axi-ethernet",
955 (Object **) &ds->enet,
956 object_property_allow_set_link,
957 OBJ_PROP_LINK_STRONG,
958 &local_err);
959 object_property_add_link(OBJECT(cs), "enet", "xlnx.axi-ethernet",
960 (Object **) &cs->enet,
961 object_property_allow_set_link,
962 OBJ_PROP_LINK_STRONG,
963 &local_err);
964 if (local_err) {
965 goto xilinx_enet_realize_fail;
966 }
967 object_property_set_link(OBJECT(ds), OBJECT(s), "enet", &local_err);
968 object_property_set_link(OBJECT(cs), OBJECT(s), "enet", &local_err);
969 if (local_err) {
970 goto xilinx_enet_realize_fail;
971 }
972
973 qemu_macaddr_default_if_unset(&s->conf.macaddr);
974 s->nic = qemu_new_nic(&net_xilinx_enet_info, &s->conf,
975 object_get_typename(OBJECT(dev)), dev->id, s);
976 qemu_format_nic_info_str(qemu_get_queue(s->nic), s->conf.macaddr.a);
977
978 tdk_init(&s->TEMAC.phy);
979 mdio_attach(&s->TEMAC.mdio_bus, &s->TEMAC.phy, s->c_phyaddr);
980
981 s->TEMAC.parent = s;
982
983 s->rxmem = g_malloc(s->c_rxmem);
984 return;
985
986 xilinx_enet_realize_fail:
987 error_propagate(errp, local_err);
988 }
989
990 static void xilinx_enet_init(Object *obj)
991 {
992 XilinxAXIEnet *s = XILINX_AXI_ENET(obj);
993 SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
994
995 object_initialize(&s->rx_data_dev, sizeof(s->rx_data_dev),
996 TYPE_XILINX_AXI_ENET_DATA_STREAM);
997 object_initialize(&s->rx_control_dev, sizeof(s->rx_control_dev),
998 TYPE_XILINX_AXI_ENET_CONTROL_STREAM);
999 object_property_add_child(OBJECT(s), "axistream-connected-target",
1000 (Object *)&s->rx_data_dev, &error_abort);
1001 object_property_add_child(OBJECT(s), "axistream-control-connected-target",
1002 (Object *)&s->rx_control_dev, &error_abort);
1003
1004 sysbus_init_irq(sbd, &s->irq);
1005
1006 memory_region_init_io(&s->iomem, OBJECT(s), &enet_ops, s, "enet", 0x40000);
1007 sysbus_init_mmio(sbd, &s->iomem);
1008 }
1009
1010 static Property xilinx_enet_properties[] = {
1011 DEFINE_PROP_UINT32("phyaddr", XilinxAXIEnet, c_phyaddr, 7),
1012 DEFINE_PROP_UINT32("rxmem", XilinxAXIEnet, c_rxmem, 0x1000),
1013 DEFINE_PROP_UINT32("txmem", XilinxAXIEnet, c_txmem, 0x1000),
1014 DEFINE_NIC_PROPERTIES(XilinxAXIEnet, conf),
1015 DEFINE_PROP_LINK("axistream-connected", XilinxAXIEnet,
1016 tx_data_dev, TYPE_STREAM_SLAVE, StreamSlave *),
1017 DEFINE_PROP_LINK("axistream-control-connected", XilinxAXIEnet,
1018 tx_control_dev, TYPE_STREAM_SLAVE, StreamSlave *),
1019 DEFINE_PROP_END_OF_LIST(),
1020 };
1021
1022 static void xilinx_enet_class_init(ObjectClass *klass, void *data)
1023 {
1024 DeviceClass *dc = DEVICE_CLASS(klass);
1025
1026 dc->realize = xilinx_enet_realize;
1027 dc->props = xilinx_enet_properties;
1028 dc->reset = xilinx_axienet_reset;
1029 }
1030
1031 static void xilinx_enet_stream_class_init(ObjectClass *klass, void *data)
1032 {
1033 StreamSlaveClass *ssc = STREAM_SLAVE_CLASS(klass);
1034
1035 ssc->push = data;
1036 }
1037
1038 static const TypeInfo xilinx_enet_info = {
1039 .name = TYPE_XILINX_AXI_ENET,
1040 .parent = TYPE_SYS_BUS_DEVICE,
1041 .instance_size = sizeof(XilinxAXIEnet),
1042 .class_init = xilinx_enet_class_init,
1043 .instance_init = xilinx_enet_init,
1044 };
1045
1046 static const TypeInfo xilinx_enet_data_stream_info = {
1047 .name = TYPE_XILINX_AXI_ENET_DATA_STREAM,
1048 .parent = TYPE_OBJECT,
1049 .instance_size = sizeof(struct XilinxAXIEnetStreamSlave),
1050 .class_init = xilinx_enet_stream_class_init,
1051 .class_data = xilinx_axienet_data_stream_push,
1052 .interfaces = (InterfaceInfo[]) {
1053 { TYPE_STREAM_SLAVE },
1054 { }
1055 }
1056 };
1057
1058 static const TypeInfo xilinx_enet_control_stream_info = {
1059 .name = TYPE_XILINX_AXI_ENET_CONTROL_STREAM,
1060 .parent = TYPE_OBJECT,
1061 .instance_size = sizeof(struct XilinxAXIEnetStreamSlave),
1062 .class_init = xilinx_enet_stream_class_init,
1063 .class_data = xilinx_axienet_control_stream_push,
1064 .interfaces = (InterfaceInfo[]) {
1065 { TYPE_STREAM_SLAVE },
1066 { }
1067 }
1068 };
1069
1070 static void xilinx_enet_register_types(void)
1071 {
1072 type_register_static(&xilinx_enet_info);
1073 type_register_static(&xilinx_enet_data_stream_info);
1074 type_register_static(&xilinx_enet_control_stream_info);
1075 }
1076
1077 type_init(xilinx_enet_register_types)