cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

imx_fec.h (8874B)


      1/*
      2 * i.MX FEC/ENET Ethernet Controller emulation.
      3 *
      4 * Copyright (c) 2013 Jean-Christophe Dubois. <jcd@tribudubois.net>
      5 *
      6 * Based on Coldfire Fast Ethernet Controller emulation.
      7 *
      8 * Copyright (c) 2007 CodeSourcery.
      9 *
     10 *  This program is free software; you can redistribute it and/or modify it
     11 *  under the terms of the GNU General Public License as published by the
     12 *  Free Software Foundation; either version 2 of the License, or
     13 *  (at your option) any later version.
     14 *
     15 *  This program is distributed in the hope that it will be useful, but WITHOUT
     16 *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     17 *  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
     18 *  for more details.
     19 *
     20 *  You should have received a copy of the GNU General Public License along
     21 *  with this program; if not, see <http://www.gnu.org/licenses/>.
     22 */
     23
     24#ifndef IMX_FEC_H
     25#define IMX_FEC_H
     26#include "qom/object.h"
     27
     28#define TYPE_IMX_FEC "imx.fec"
     29OBJECT_DECLARE_SIMPLE_TYPE(IMXFECState, IMX_FEC)
     30
     31#define TYPE_IMX_ENET "imx.enet"
     32
     33#include "hw/sysbus.h"
     34#include "net/net.h"
     35
     36#define ENET_EIR               1
     37#define ENET_EIMR              2
     38#define ENET_RDAR              4
     39#define ENET_TDAR              5
     40#define ENET_ECR               9
     41#define ENET_MMFR              16
     42#define ENET_MSCR              17
     43#define ENET_MIBC              25
     44#define ENET_RCR               33
     45#define ENET_TCR               49
     46#define ENET_PALR              57
     47#define ENET_PAUR              58
     48#define ENET_OPD               59
     49#define ENET_IAUR              70
     50#define ENET_IALR              71
     51#define ENET_GAUR              72
     52#define ENET_GALR              73
     53#define ENET_TFWR              81
     54#define ENET_FRBR              83
     55#define ENET_FRSR              84
     56#define ENET_TDSR1             89
     57#define ENET_TDSR2             92
     58#define ENET_RDSR              96
     59#define ENET_TDSR              97
     60#define ENET_MRBR              98
     61#define ENET_RSFL              100
     62#define ENET_RSEM              101
     63#define ENET_RAEM              102
     64#define ENET_RAFL              103
     65#define ENET_TSEM              104
     66#define ENET_TAEM              105
     67#define ENET_TAFL              106
     68#define ENET_TIPG              107
     69#define ENET_FTRL              108
     70#define ENET_TACC              112
     71#define ENET_RACC              113
     72#define ENET_TDAR1             121
     73#define ENET_TDAR2             123
     74#define ENET_MIIGSK_CFGR       192
     75#define ENET_MIIGSK_ENR        194
     76#define ENET_ATCR              256
     77#define ENET_ATVR              257
     78#define ENET_ATOFF             258
     79#define ENET_ATPER             259
     80#define ENET_ATCOR             260
     81#define ENET_ATINC             261
     82#define ENET_ATSTMP            262
     83#define ENET_TGSR              385
     84#define ENET_TCSR0             386
     85#define ENET_TCCR0             387
     86#define ENET_TCSR1             388
     87#define ENET_TCCR1             389
     88#define ENET_TCSR2             390
     89#define ENET_TCCR2             391
     90#define ENET_TCSR3             392
     91#define ENET_TCCR3             393
     92#define ENET_MAX               400
     93
     94
     95/* EIR and EIMR */
     96#define ENET_INT_HB            (1 << 31)
     97#define ENET_INT_BABR          (1 << 30)
     98#define ENET_INT_BABT          (1 << 29)
     99#define ENET_INT_GRA           (1 << 28)
    100#define ENET_INT_TXF           (1 << 27)
    101#define ENET_INT_TXB           (1 << 26)
    102#define ENET_INT_RXF           (1 << 25)
    103#define ENET_INT_RXB           (1 << 24)
    104#define ENET_INT_MII           (1 << 23)
    105#define ENET_INT_EBERR         (1 << 22)
    106#define ENET_INT_LC            (1 << 21)
    107#define ENET_INT_RL            (1 << 20)
    108#define ENET_INT_UN            (1 << 19)
    109#define ENET_INT_PLR           (1 << 18)
    110#define ENET_INT_WAKEUP        (1 << 17)
    111#define ENET_INT_TS_AVAIL      (1 << 16)
    112#define ENET_INT_TS_TIMER      (1 << 15)
    113#define ENET_INT_TXF2          (1 <<  7)
    114#define ENET_INT_TXB2          (1 <<  6)
    115#define ENET_INT_TXF1          (1 <<  3)
    116#define ENET_INT_TXB1          (1 <<  2)
    117
    118#define ENET_INT_MAC           (ENET_INT_HB | ENET_INT_BABR | ENET_INT_BABT | \
    119                                ENET_INT_GRA | ENET_INT_TXF | ENET_INT_TXB | \
    120                                ENET_INT_RXF | ENET_INT_RXB | ENET_INT_MII | \
    121                                ENET_INT_EBERR | ENET_INT_LC | ENET_INT_RL | \
    122                                ENET_INT_UN | ENET_INT_PLR | ENET_INT_WAKEUP | \
    123                                ENET_INT_TS_AVAIL | ENET_INT_TXF1 | \
    124                                ENET_INT_TXB1 | ENET_INT_TXF2 | ENET_INT_TXB2)
    125
    126/* RDAR */
    127#define ENET_RDAR_RDAR         (1 << 24)
    128
    129/* TDAR */
    130#define ENET_TDAR_TDAR         (1 << 24)
    131
    132/* ECR */
    133#define ENET_ECR_RESET         (1 << 0)
    134#define ENET_ECR_ETHEREN       (1 << 1)
    135#define ENET_ECR_MAGICEN       (1 << 2)
    136#define ENET_ECR_SLEEP         (1 << 3)
    137#define ENET_ECR_EN1588        (1 << 4)
    138#define ENET_ECR_SPEED         (1 << 5)
    139#define ENET_ECR_DBGEN         (1 << 6)
    140#define ENET_ECR_STOPEN        (1 << 7)
    141#define ENET_ECR_DSBWP         (1 << 8)
    142
    143/* MIBC */
    144#define ENET_MIBC_MIB_DIS      (1 << 31)
    145#define ENET_MIBC_MIB_IDLE     (1 << 30)
    146#define ENET_MIBC_MIB_CLEAR    (1 << 29)
    147
    148/* RCR */
    149#define ENET_RCR_LOOP          (1 << 0)
    150#define ENET_RCR_DRT           (1 << 1)
    151#define ENET_RCR_MII_MODE      (1 << 2)
    152#define ENET_RCR_PROM          (1 << 3)
    153#define ENET_RCR_BC_REJ        (1 << 4)
    154#define ENET_RCR_FCE           (1 << 5)
    155#define ENET_RCR_RGMII_EN      (1 << 6)
    156#define ENET_RCR_RMII_MODE     (1 << 8)
    157#define ENET_RCR_RMII_10T      (1 << 9)
    158#define ENET_RCR_PADEN         (1 << 12)
    159#define ENET_RCR_PAUFWD        (1 << 13)
    160#define ENET_RCR_CRCFWD        (1 << 14)
    161#define ENET_RCR_CFEN          (1 << 15)
    162#define ENET_RCR_MAX_FL_SHIFT  (16)
    163#define ENET_RCR_MAX_FL_LENGTH (14)
    164#define ENET_RCR_NLC           (1 << 30)
    165#define ENET_RCR_GRS           (1 << 31)
    166
    167#define ENET_MAX_FRAME_SIZE    (1 << ENET_RCR_MAX_FL_LENGTH)
    168
    169/* TCR */
    170#define ENET_TCR_GTS           (1 << 0)
    171#define ENET_TCR_FDEN          (1 << 2)
    172#define ENET_TCR_TFC_PAUSE     (1 << 3)
    173#define ENET_TCR_RFC_PAUSE     (1 << 4)
    174#define ENET_TCR_ADDSEL_SHIFT  (5)
    175#define ENET_TCR_ADDSEL_LENGTH (3)
    176#define ENET_TCR_CRCFWD        (1 << 9)
    177
    178/* RDSR */
    179#define ENET_TWFR_TFWR_SHIFT   (0)
    180#define ENET_TWFR_TFWR_LENGTH  (6)
    181#define ENET_TWFR_STRFWD       (1 << 8)
    182
    183#define ENET_RACC_SHIFT16      BIT(7)
    184
    185/* Buffer Descriptor.  */
    186typedef struct {
    187    uint16_t length;
    188    uint16_t flags;
    189    uint32_t data;
    190} IMXFECBufDesc;
    191
    192#define ENET_BD_R              (1 << 15)
    193#define ENET_BD_E              (1 << 15)
    194#define ENET_BD_O1             (1 << 14)
    195#define ENET_BD_W              (1 << 13)
    196#define ENET_BD_O2             (1 << 12)
    197#define ENET_BD_L              (1 << 11)
    198#define ENET_BD_TC             (1 << 10)
    199#define ENET_BD_ABC            (1 << 9)
    200#define ENET_BD_M              (1 << 8)
    201#define ENET_BD_BC             (1 << 7)
    202#define ENET_BD_MC             (1 << 6)
    203#define ENET_BD_LG             (1 << 5)
    204#define ENET_BD_NO             (1 << 4)
    205#define ENET_BD_CR             (1 << 2)
    206#define ENET_BD_OV             (1 << 1)
    207#define ENET_BD_TR             (1 << 0)
    208
    209typedef struct {
    210    uint16_t length;
    211    uint16_t flags;
    212    uint32_t data;
    213    uint16_t status;
    214    uint16_t option;
    215    uint16_t checksum;
    216    uint16_t head_proto;
    217    uint32_t last_buffer;
    218    uint32_t timestamp;
    219    uint32_t reserved[2];
    220} IMXENETBufDesc;
    221
    222#define ENET_BD_ME             (1 << 15)
    223#define ENET_BD_TX_INT         (1 << 14)
    224#define ENET_BD_TS             (1 << 13)
    225#define ENET_BD_PINS           (1 << 12)
    226#define ENET_BD_IINS           (1 << 11)
    227#define ENET_BD_PE             (1 << 10)
    228#define ENET_BD_CE             (1 << 9)
    229#define ENET_BD_UC             (1 << 8)
    230#define ENET_BD_RX_INT         (1 << 7)
    231
    232#define ENET_BD_TXE            (1 << 15)
    233#define ENET_BD_UE             (1 << 13)
    234#define ENET_BD_EE             (1 << 12)
    235#define ENET_BD_FE             (1 << 11)
    236#define ENET_BD_LCE            (1 << 10)
    237#define ENET_BD_OE             (1 << 9)
    238#define ENET_BD_TSE            (1 << 8)
    239#define ENET_BD_ICE            (1 << 5)
    240#define ENET_BD_PCR            (1 << 4)
    241#define ENET_BD_VLAN           (1 << 2)
    242#define ENET_BD_IPV6           (1 << 1)
    243#define ENET_BD_FRAG           (1 << 0)
    244
    245#define ENET_BD_BDU            (1 << 31)
    246
    247#define ENET_TX_RING_NUM       3
    248
    249#define FSL_IMX25_FEC_SIZE      0x4000
    250
    251struct IMXFECState {
    252    /*< private >*/
    253    SysBusDevice parent_obj;
    254
    255    /*< public >*/
    256    NICState *nic;
    257    NICConf conf;
    258    qemu_irq irq[2];
    259    MemoryRegion iomem;
    260
    261    uint32_t regs[ENET_MAX];
    262    uint32_t rx_descriptor;
    263
    264    uint32_t tx_descriptor[ENET_TX_RING_NUM];
    265    uint32_t tx_ring_num;
    266
    267    uint32_t phy_status;
    268    uint32_t phy_control;
    269    uint32_t phy_advertise;
    270    uint32_t phy_int;
    271    uint32_t phy_int_mask;
    272    uint32_t phy_num;
    273
    274    bool is_fec;
    275
    276    /* Buffer used to assemble a Tx frame */
    277    uint8_t frame[ENET_MAX_FRAME_SIZE];
    278};
    279
    280#endif