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