xref: /openbmc/qemu/hw/net/fsl_etsec/etsec.h (revision 7284d53f6fc2c00e930155e7cf1d1ed4ea59f56f)
1eb1e7c3eSFabien Chouteau /*
2eb1e7c3eSFabien Chouteau  * QEMU Freescale eTSEC Emulator
3eb1e7c3eSFabien Chouteau  *
4eb1e7c3eSFabien Chouteau  * Copyright (c) 2011-2013 AdaCore
5eb1e7c3eSFabien Chouteau  *
6eb1e7c3eSFabien Chouteau  * Permission is hereby granted, free of charge, to any person obtaining a copy
7eb1e7c3eSFabien Chouteau  * of this software and associated documentation files (the "Software"), to deal
8eb1e7c3eSFabien Chouteau  * in the Software without restriction, including without limitation the rights
9eb1e7c3eSFabien Chouteau  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10eb1e7c3eSFabien Chouteau  * copies of the Software, and to permit persons to whom the Software is
11eb1e7c3eSFabien Chouteau  * furnished to do so, subject to the following conditions:
12eb1e7c3eSFabien Chouteau  *
13eb1e7c3eSFabien Chouteau  * The above copyright notice and this permission notice shall be included in
14eb1e7c3eSFabien Chouteau  * all copies or substantial portions of the Software.
15eb1e7c3eSFabien Chouteau  *
16eb1e7c3eSFabien Chouteau  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17eb1e7c3eSFabien Chouteau  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18eb1e7c3eSFabien Chouteau  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19eb1e7c3eSFabien Chouteau  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20eb1e7c3eSFabien Chouteau  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21eb1e7c3eSFabien Chouteau  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22eb1e7c3eSFabien Chouteau  * THE SOFTWARE.
23eb1e7c3eSFabien Chouteau  */
242a6a4076SMarkus Armbruster 
252a6a4076SMarkus Armbruster #ifndef ETSEC_H
262a6a4076SMarkus Armbruster #define ETSEC_H
27eb1e7c3eSFabien Chouteau 
28eb1e7c3eSFabien Chouteau #include "hw/sysbus.h"
29eb1e7c3eSFabien Chouteau #include "net/net.h"
30eb1e7c3eSFabien Chouteau #include "hw/ptimer.h"
31db1015e9SEduardo Habkost #include "qom/object.h"
32eb1e7c3eSFabien Chouteau 
33eb1e7c3eSFabien Chouteau /* Buffer Descriptors */
34eb1e7c3eSFabien Chouteau 
35eb1e7c3eSFabien Chouteau typedef struct eTSEC_rxtx_bd {
36eb1e7c3eSFabien Chouteau     uint16_t flags;
37eb1e7c3eSFabien Chouteau     uint16_t length;
38eb1e7c3eSFabien Chouteau     uint32_t bufptr;
39eb1e7c3eSFabien Chouteau } eTSEC_rxtx_bd;
40eb1e7c3eSFabien Chouteau 
41eb1e7c3eSFabien Chouteau #define BD_WRAP       (1 << 13)
42eb1e7c3eSFabien Chouteau #define BD_INTERRUPT  (1 << 12)
43eb1e7c3eSFabien Chouteau #define BD_LAST       (1 << 11)
44eb1e7c3eSFabien Chouteau 
45eb1e7c3eSFabien Chouteau #define BD_TX_READY     (1 << 15)
46eb1e7c3eSFabien Chouteau #define BD_TX_PADCRC    (1 << 14)
47eb1e7c3eSFabien Chouteau #define BD_TX_TC        (1 << 10)
48eb1e7c3eSFabien Chouteau #define BD_TX_PREDEF    (1 << 9)
49eb1e7c3eSFabien Chouteau #define BD_TX_HFELC     (1 << 7)
50eb1e7c3eSFabien Chouteau #define BD_TX_CFRL      (1 << 6)
51eb1e7c3eSFabien Chouteau #define BD_TX_RC_MASK   0xF
52eb1e7c3eSFabien Chouteau #define BD_TX_RC_OFFSET 0x2
53eb1e7c3eSFabien Chouteau #define BD_TX_TOEUN     (1 << 1)
54eb1e7c3eSFabien Chouteau #define BD_TX_TR        (1 << 0)
55eb1e7c3eSFabien Chouteau 
56eb1e7c3eSFabien Chouteau #define BD_RX_EMPTY     (1 << 15)
57eb1e7c3eSFabien Chouteau #define BD_RX_RO1       (1 << 14)
58eb1e7c3eSFabien Chouteau #define BD_RX_FIRST     (1 << 10)
59eb1e7c3eSFabien Chouteau #define BD_RX_MISS      (1 << 8)
60eb1e7c3eSFabien Chouteau #define BD_RX_BROADCAST (1 << 7)
61eb1e7c3eSFabien Chouteau #define BD_RX_MULTICAST (1 << 6)
62eb1e7c3eSFabien Chouteau #define BD_RX_LG        (1 << 5)
63eb1e7c3eSFabien Chouteau #define BD_RX_NO        (1 << 4)
64eb1e7c3eSFabien Chouteau #define BD_RX_SH        (1 << 3)
65eb1e7c3eSFabien Chouteau #define BD_RX_CR        (1 << 2)
66eb1e7c3eSFabien Chouteau #define BD_RX_OV        (1 << 1)
67eb1e7c3eSFabien Chouteau #define BD_RX_TR        (1 << 0)
68eb1e7c3eSFabien Chouteau 
69eb1e7c3eSFabien Chouteau /* Tx FCB flags */
70eb1e7c3eSFabien Chouteau #define FCB_TX_VLN     (1 << 7)
71eb1e7c3eSFabien Chouteau #define FCB_TX_IP      (1 << 6)
72eb1e7c3eSFabien Chouteau #define FCB_TX_IP6     (1 << 5)
73eb1e7c3eSFabien Chouteau #define FCB_TX_TUP     (1 << 4)
74eb1e7c3eSFabien Chouteau #define FCB_TX_UDP     (1 << 3)
75eb1e7c3eSFabien Chouteau #define FCB_TX_CIP     (1 << 2)
76eb1e7c3eSFabien Chouteau #define FCB_TX_CTU     (1 << 1)
77eb1e7c3eSFabien Chouteau #define FCB_TX_NPH     (1 << 0)
78eb1e7c3eSFabien Chouteau 
79eb1e7c3eSFabien Chouteau /* eTSEC */
80eb1e7c3eSFabien Chouteau 
81eb1e7c3eSFabien Chouteau /* Number of register in the device */
82eb1e7c3eSFabien Chouteau #define ETSEC_REG_NUMBER 1024
83eb1e7c3eSFabien Chouteau 
84eb1e7c3eSFabien Chouteau typedef struct eTSEC_Register {
85eb1e7c3eSFabien Chouteau     const char *name;
86eb1e7c3eSFabien Chouteau     const char *desc;
87eb1e7c3eSFabien Chouteau     uint32_t    access;
88eb1e7c3eSFabien Chouteau     uint32_t    value;
89eb1e7c3eSFabien Chouteau } eTSEC_Register;
90eb1e7c3eSFabien Chouteau 
91db1015e9SEduardo Habkost struct eTSEC {
92eb1e7c3eSFabien Chouteau     SysBusDevice  busdev;
93eb1e7c3eSFabien Chouteau 
94eb1e7c3eSFabien Chouteau     MemoryRegion  io_area;
95eb1e7c3eSFabien Chouteau 
96eb1e7c3eSFabien Chouteau     eTSEC_Register regs[ETSEC_REG_NUMBER];
97eb1e7c3eSFabien Chouteau 
98eb1e7c3eSFabien Chouteau     NICState *nic;
99eb1e7c3eSFabien Chouteau     NICConf   conf;
100eb1e7c3eSFabien Chouteau 
101eb1e7c3eSFabien Chouteau     /* Tx */
102eb1e7c3eSFabien Chouteau 
103eb1e7c3eSFabien Chouteau     uint8_t       *tx_buffer;
104eb1e7c3eSFabien Chouteau     uint32_t       tx_buffer_len;
105eb1e7c3eSFabien Chouteau     eTSEC_rxtx_bd  first_bd;
106eb1e7c3eSFabien Chouteau 
107eb1e7c3eSFabien Chouteau     /* Rx */
108eb1e7c3eSFabien Chouteau 
109eb1e7c3eSFabien Chouteau     uint8_t       *rx_buffer;
110eb1e7c3eSFabien Chouteau     uint32_t       rx_buffer_len;
111eb1e7c3eSFabien Chouteau     uint32_t       rx_remaining_data;
112eb1e7c3eSFabien Chouteau     uint8_t        rx_first_in_frame;
113eb1e7c3eSFabien Chouteau     uint8_t        rx_fcb_size;
114eb1e7c3eSFabien Chouteau     eTSEC_rxtx_bd  rx_first_bd;
115eb1e7c3eSFabien Chouteau     uint8_t        rx_fcb[10];
116eb1e7c3eSFabien Chouteau     uint32_t       rx_padding;
117eb1e7c3eSFabien Chouteau 
118eb1e7c3eSFabien Chouteau     /* IRQs */
119eb1e7c3eSFabien Chouteau     qemu_irq     tx_irq;
120eb1e7c3eSFabien Chouteau     qemu_irq     rx_irq;
121eb1e7c3eSFabien Chouteau     qemu_irq     err_irq;
122eb1e7c3eSFabien Chouteau 
123eb1e7c3eSFabien Chouteau 
124eb1e7c3eSFabien Chouteau     uint16_t phy_status;
125eb1e7c3eSFabien Chouteau     uint16_t phy_control;
126eb1e7c3eSFabien Chouteau 
127eb1e7c3eSFabien Chouteau     /* Polling */
128eb1e7c3eSFabien Chouteau     struct ptimer_state *ptimer;
129eb1e7c3eSFabien Chouteau 
130575bafd1SFam Zheng     /* Whether we should flush the rx queue when buffer becomes available. */
131575bafd1SFam Zheng     bool need_flush;
132db1015e9SEduardo Habkost };
133db1015e9SEduardo Habkost typedef struct eTSEC eTSEC;
134eb1e7c3eSFabien Chouteau 
135eb1e7c3eSFabien Chouteau #define TYPE_ETSEC_COMMON "eTSEC"
136*8063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(eTSEC, ETSEC_COMMON)
137eb1e7c3eSFabien Chouteau 
138eb1e7c3eSFabien Chouteau #define eTSEC_TRANSMIT 1
139eb1e7c3eSFabien Chouteau #define eTSEC_RECEIVE  2
140eb1e7c3eSFabien Chouteau 
141fd8e3381SMichael Davidsaver void etsec_update_irq(eTSEC *etsec);
142fd8e3381SMichael Davidsaver 
143eb1e7c3eSFabien Chouteau void etsec_walk_tx_ring(eTSEC *etsec, int ring_nbr);
144eb1e7c3eSFabien Chouteau void etsec_walk_rx_ring(eTSEC *etsec, int ring_nbr);
145b6cb6610SFam Zheng ssize_t etsec_rx_ring_write(eTSEC *etsec, const uint8_t *buf, size_t size);
146eb1e7c3eSFabien Chouteau 
147eb1e7c3eSFabien Chouteau void etsec_write_miim(eTSEC          *etsec,
148eb1e7c3eSFabien Chouteau                       eTSEC_Register *reg,
149eb1e7c3eSFabien Chouteau                       uint32_t        reg_index,
150eb1e7c3eSFabien Chouteau                       uint32_t        value);
151eb1e7c3eSFabien Chouteau 
152eb1e7c3eSFabien Chouteau void etsec_miim_link_status(eTSEC *etsec, NetClientState *nc);
153eb1e7c3eSFabien Chouteau 
1542a6a4076SMarkus Armbruster #endif /* ETSEC_H */
155