xref: /openbmc/qemu/hw/net/e1000e_core.h (revision 35ac6831d98e18e2c78c85c93e3a6ca1f1ae3e58)
16f3fbe4eSDmitry Fleytman /*
26f3fbe4eSDmitry Fleytman  * Core code for QEMU e1000e emulation
36f3fbe4eSDmitry Fleytman  *
46f3fbe4eSDmitry Fleytman  * Software developer's manuals:
56f3fbe4eSDmitry Fleytman  * http://www.intel.com/content/dam/doc/datasheet/82574l-gbe-controller-datasheet.pdf
66f3fbe4eSDmitry Fleytman  *
76f3fbe4eSDmitry Fleytman  * Copyright (c) 2015 Ravello Systems LTD (http://ravellosystems.com)
86f3fbe4eSDmitry Fleytman  * Developed by Daynix Computing LTD (http://www.daynix.com)
96f3fbe4eSDmitry Fleytman  *
106f3fbe4eSDmitry Fleytman  * Authors:
116f3fbe4eSDmitry Fleytman  * Dmitry Fleytman <dmitry@daynix.com>
126f3fbe4eSDmitry Fleytman  * Leonid Bloch <leonid@daynix.com>
136f3fbe4eSDmitry Fleytman  * Yan Vugenfirer <yan@daynix.com>
146f3fbe4eSDmitry Fleytman  *
156f3fbe4eSDmitry Fleytman  * Based on work done by:
166f3fbe4eSDmitry Fleytman  * Nir Peleg, Tutis Systems Ltd. for Qumranet Inc.
176f3fbe4eSDmitry Fleytman  * Copyright (c) 2008 Qumranet
186f3fbe4eSDmitry Fleytman  * Based on work done by:
196f3fbe4eSDmitry Fleytman  * Copyright (c) 2007 Dan Aloni
206f3fbe4eSDmitry Fleytman  * Copyright (c) 2004 Antony T Curtis
216f3fbe4eSDmitry Fleytman  *
226f3fbe4eSDmitry Fleytman  * This library is free software; you can redistribute it and/or
236f3fbe4eSDmitry Fleytman  * modify it under the terms of the GNU Lesser General Public
246f3fbe4eSDmitry Fleytman  * License as published by the Free Software Foundation; either
257cd2a9faSChetan Pant  * version 2.1 of the License, or (at your option) any later version.
266f3fbe4eSDmitry Fleytman  *
276f3fbe4eSDmitry Fleytman  * This library is distributed in the hope that it will be useful,
286f3fbe4eSDmitry Fleytman  * but WITHOUT ANY WARRANTY; without even the implied warranty of
296f3fbe4eSDmitry Fleytman  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
306f3fbe4eSDmitry Fleytman  * Lesser General Public License for more details.
316f3fbe4eSDmitry Fleytman  *
326f3fbe4eSDmitry Fleytman  * You should have received a copy of the GNU Lesser General Public
336f3fbe4eSDmitry Fleytman  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
346f3fbe4eSDmitry Fleytman  */
356f3fbe4eSDmitry Fleytman 
36f91005e1SMarkus Armbruster #ifndef HW_NET_E1000E_CORE_H
37f91005e1SMarkus Armbruster #define HW_NET_E1000E_CORE_H
38f91005e1SMarkus Armbruster 
396f3fbe4eSDmitry Fleytman #define E1000E_PHY_PAGE_SIZE    (0x20)
406f3fbe4eSDmitry Fleytman #define E1000E_PHY_PAGES        (0x07)
416f3fbe4eSDmitry Fleytman #define E1000E_MAC_SIZE         (0x8000)
426f3fbe4eSDmitry Fleytman #define E1000E_EEPROM_SIZE      (64)
436f3fbe4eSDmitry Fleytman #define E1000E_MSIX_VEC_NUM     (5)
446f3fbe4eSDmitry Fleytman #define E1000E_NUM_QUEUES       (2)
456f3fbe4eSDmitry Fleytman 
466f3fbe4eSDmitry Fleytman typedef struct E1000Core E1000ECore;
476f3fbe4eSDmitry Fleytman 
486f3fbe4eSDmitry Fleytman enum { PHY_R = BIT(0),
496f3fbe4eSDmitry Fleytman        PHY_W = BIT(1),
506f3fbe4eSDmitry Fleytman        PHY_RW = PHY_R | PHY_W,
516f3fbe4eSDmitry Fleytman        PHY_ANYPAGE = BIT(2) };
526f3fbe4eSDmitry Fleytman 
536f3fbe4eSDmitry Fleytman typedef struct E1000IntrDelayTimer_st {
546f3fbe4eSDmitry Fleytman     QEMUTimer *timer;
556f3fbe4eSDmitry Fleytman     bool running;
566f3fbe4eSDmitry Fleytman     uint32_t delay_reg;
576f3fbe4eSDmitry Fleytman     uint32_t delay_resolution_ns;
586f3fbe4eSDmitry Fleytman     E1000ECore *core;
596f3fbe4eSDmitry Fleytman } E1000IntrDelayTimer;
606f3fbe4eSDmitry Fleytman 
616f3fbe4eSDmitry Fleytman struct E1000Core {
626f3fbe4eSDmitry Fleytman     uint32_t mac[E1000E_MAC_SIZE];
636f3fbe4eSDmitry Fleytman     uint16_t phy[E1000E_PHY_PAGES][E1000E_PHY_PAGE_SIZE];
646f3fbe4eSDmitry Fleytman     uint16_t eeprom[E1000E_EEPROM_SIZE];
656f3fbe4eSDmitry Fleytman 
666f3fbe4eSDmitry Fleytman     uint32_t rxbuf_sizes[E1000_PSRCTL_BUFFS_PER_DESC];
676f3fbe4eSDmitry Fleytman     uint32_t rx_desc_buf_size;
686f3fbe4eSDmitry Fleytman     uint32_t rxbuf_min_shift;
696f3fbe4eSDmitry Fleytman     uint8_t rx_desc_len;
706f3fbe4eSDmitry Fleytman 
716f3fbe4eSDmitry Fleytman     QEMUTimer *autoneg_timer;
726f3fbe4eSDmitry Fleytman 
736f3fbe4eSDmitry Fleytman     struct e1000e_tx {
746f3fbe4eSDmitry Fleytman         e1000x_txd_props props;
756f3fbe4eSDmitry Fleytman 
766f3fbe4eSDmitry Fleytman         bool skip_cp;
777d08c73eSEd Swierk via Qemu-devel         unsigned char sum_needed;
787d08c73eSEd Swierk via Qemu-devel         bool cptse;
796f3fbe4eSDmitry Fleytman         struct NetTxPkt *tx_pkt;
806f3fbe4eSDmitry Fleytman     } tx[E1000E_NUM_QUEUES];
816f3fbe4eSDmitry Fleytman 
826f3fbe4eSDmitry Fleytman     struct NetRxPkt *rx_pkt;
836f3fbe4eSDmitry Fleytman 
846f3fbe4eSDmitry Fleytman     bool has_vnet;
856f3fbe4eSDmitry Fleytman     int max_queue_num;
866f3fbe4eSDmitry Fleytman 
876f3fbe4eSDmitry Fleytman     /* Interrupt moderation management */
886f3fbe4eSDmitry Fleytman     uint32_t delayed_causes;
896f3fbe4eSDmitry Fleytman 
906f3fbe4eSDmitry Fleytman     E1000IntrDelayTimer radv;
916f3fbe4eSDmitry Fleytman     E1000IntrDelayTimer rdtr;
926f3fbe4eSDmitry Fleytman     E1000IntrDelayTimer raid;
936f3fbe4eSDmitry Fleytman 
946f3fbe4eSDmitry Fleytman     E1000IntrDelayTimer tadv;
956f3fbe4eSDmitry Fleytman     E1000IntrDelayTimer tidv;
966f3fbe4eSDmitry Fleytman 
976f3fbe4eSDmitry Fleytman     E1000IntrDelayTimer itr;
986f3fbe4eSDmitry Fleytman 
996f3fbe4eSDmitry Fleytman     E1000IntrDelayTimer eitr[E1000E_MSIX_VEC_NUM];
1006f3fbe4eSDmitry Fleytman 
1016f3fbe4eSDmitry Fleytman     uint32_t itr_guest_value;
1026f3fbe4eSDmitry Fleytman     uint32_t eitr_guest_value[E1000E_MSIX_VEC_NUM];
1036f3fbe4eSDmitry Fleytman 
1046f3fbe4eSDmitry Fleytman     uint16_t vet;
1056f3fbe4eSDmitry Fleytman 
1066f3fbe4eSDmitry Fleytman     uint8_t permanent_mac[ETH_ALEN];
1076f3fbe4eSDmitry Fleytman 
1086f3fbe4eSDmitry Fleytman     NICState *owner_nic;
1096f3fbe4eSDmitry Fleytman     PCIDevice *owner;
1106f3fbe4eSDmitry Fleytman     void (*owner_start_recv)(PCIDevice *d);
1114712c158SJan Kiszka 
112*5fb7d149SAkihiko Odaki     int64_t timadj;
1136f3fbe4eSDmitry Fleytman };
1146f3fbe4eSDmitry Fleytman 
1156f3fbe4eSDmitry Fleytman void
1166f3fbe4eSDmitry Fleytman e1000e_core_write(E1000ECore *core, hwaddr addr, uint64_t val, unsigned size);
1176f3fbe4eSDmitry Fleytman 
1186f3fbe4eSDmitry Fleytman uint64_t
1196f3fbe4eSDmitry Fleytman e1000e_core_read(E1000ECore *core, hwaddr addr, unsigned size);
1206f3fbe4eSDmitry Fleytman 
1216f3fbe4eSDmitry Fleytman void
1226f3fbe4eSDmitry Fleytman e1000e_core_pci_realize(E1000ECore      *regs,
1236f3fbe4eSDmitry Fleytman                        const uint16_t *eeprom_templ,
1246f3fbe4eSDmitry Fleytman                        uint32_t        eeprom_size,
1256f3fbe4eSDmitry Fleytman                        const uint8_t  *macaddr);
1266f3fbe4eSDmitry Fleytman 
1276f3fbe4eSDmitry Fleytman void
1286f3fbe4eSDmitry Fleytman e1000e_core_reset(E1000ECore *core);
1296f3fbe4eSDmitry Fleytman 
1306f3fbe4eSDmitry Fleytman void
1316f3fbe4eSDmitry Fleytman e1000e_core_pre_save(E1000ECore *core);
1326f3fbe4eSDmitry Fleytman 
1336f3fbe4eSDmitry Fleytman int
1346f3fbe4eSDmitry Fleytman e1000e_core_post_load(E1000ECore *core);
1356f3fbe4eSDmitry Fleytman 
1366f3fbe4eSDmitry Fleytman void
1376f3fbe4eSDmitry Fleytman e1000e_core_set_link_status(E1000ECore *core);
1386f3fbe4eSDmitry Fleytman 
1396f3fbe4eSDmitry Fleytman void
1406f3fbe4eSDmitry Fleytman e1000e_core_pci_uninit(E1000ECore *core);
1416f3fbe4eSDmitry Fleytman 
142205ce567SPhilippe Mathieu-Daudé bool
1436f3fbe4eSDmitry Fleytman e1000e_can_receive(E1000ECore *core);
1446f3fbe4eSDmitry Fleytman 
1456f3fbe4eSDmitry Fleytman ssize_t
1466f3fbe4eSDmitry Fleytman e1000e_receive(E1000ECore *core, const uint8_t *buf, size_t size);
1476f3fbe4eSDmitry Fleytman 
1486f3fbe4eSDmitry Fleytman ssize_t
1496f3fbe4eSDmitry Fleytman e1000e_receive_iov(E1000ECore *core, const struct iovec *iov, int iovcnt);
1506ee0e20bSDmitry Fleytman 
1516ee0e20bSDmitry Fleytman void
1526ee0e20bSDmitry Fleytman e1000e_start_recv(E1000ECore *core);
153f91005e1SMarkus Armbruster 
154f91005e1SMarkus Armbruster #endif
155