source: soft/giet_vm/giet_drivers/nic_driver.h @ 496

Last change on this file since 496 was 481, checked in by alain, 9 years ago

1) The NIC, IOC, DMA and HBA drivers have been adapted to support the new _v2p_translate() function prototype (returns void).
2) The _mmc_inval() and _mmc_sync() functions does not use anymore the hard lock in the MMC, but use a soft spin_lock.
3) The NIC driver does not use anymore the GIET_NIC_BUFSIZE, GIET_NIC_NBUFS, and GIET_NIC_TIMEOUT parameters (removed from giet_config.h file).
4) The NIC driver registers map has been modified to support 64 bytes buffer descriptors for chained buffers.

File size: 7.7 KB
Line 
1///////////////////////////////////////////////////////////////////////////////////
2// File     : nic_driver.h
3// Date     : 01/11/2013
4// Author   : alain greiner
5// Copyright (c) UPMC-LIP6
6///////////////////////////////////////////////////////////////////////////////////
7// The nic_driver.c and nic_driver.h files are part ot the GIET-VM nano-kernel.
8// This driver supports the vci_multi_nic component.
9//
10// It can exist only one network controller in the architecture, but this
11// component supports several channels.
12//
13// It can be accessed directly by software with memcpy(),
14// or it can be accessed through the vci_chbuf_dma component:
15// 
16// The '_nic_sync_write' and '_nic_sync_read' functions use a memcpy strategy to
17// implement the transfer between a data buffer (user space) and the NIC
18// buffer (kernel space). They are blocking until completion of the transfer.
19//
20// The _nic_cma_start() and _nic_cma_stop() functions use the VciChbufDma component
21// to transfer a flow of packets from the NIC RX hard chbuf (two containers)
22// to an user RX chbuf (two containers), and to transfer another flow of packets
23// from an user TX chbuf (two containers) to the NIC TX chbuf (two containers).
24// One NIC channel and two CMA channels must be allocated to the task
25// in the mapping_info data structure.
26//
27// All these access functions return -1 in case of error.
28//
29// The SEG_NIC_BASE address must be defined in the hard_config.h file.
30//////////////////////////////////////////////////////////////////////////////////
31
32#ifndef _GIET_NIC_DRIVERS_H_
33#define _GIET_NIC_DRIVERS_H_
34
35#include <giet_config.h>
36
37///////////////////////////////////////////////////////////////////////////////////
38//           Global Addressable Registers
39///////////////////////////////////////////////////////////////////////////////////
40
41enum SoclibMultiNicHyperRegisters {
42    NIC_G_VIS                        = 0,   // bitfield : bit N = 0 -> channel N disabled
43    NIC_G_ON                         = 1,   // boolean : NIC component activated
44    NIC_G_NB_CHAN                    = 2,   // Number of channels (read only)
45    NIC_G_BC_ENABLE                  = 3,   // boolean : Enable Broadcast if non zero
46    NIC_G_TDM_ENABLE                 = 4,   // boolean : TDM Scheduler if non zero
47    NIC_G_TDM_PERIOD                 = 5,   // TDM time slot value
48    NIC_G_BYPASS_ENABLE              = 6,   // boolean : Enable bypass for TX packets
49    // alignment
50    NIC_G_MAC_4                      = 8,   // channel mac address 32 LSB bits array[8]
51    NIC_G_MAC_2                      = 16,  // channel mac address 16 MSB bits array[8]
52    // alignment
53    NIC_G_NPKT_RX_G2S_RECEIVED       = 32,  // number of packets received on GMII RX port
54    NIC_G_NPKT_RX_G2S_DISCARDED      = 33,  // number of RX packets discarded by RX_G2S FSM
55
56    NIC_G_NPKT_RX_DES_SUCCESS        = 34,  // number of RX packets transmited by RX_DES FSM
57    NIC_G_NPKT_RX_DES_TOO_SMALL      = 35,  // number of discarded too small RX packets (<60B)
58    NIC_G_NPKT_RX_DES_TOO_BIG        = 36,  // number of discarded too big RX packets (>1514B)
59    NIC_G_NPKT_RX_DES_MFIFO_FULL     = 37,  // number of discarded RX packets fifo full
60    NIC_G_NPKT_RX_DES_CRC_FAIL       = 38,  // number of discarded RX packets CRC32 failure
61
62    NIC_G_NPKT_RX_DISPATCH_RECEIVED  = 39,  // number of packets received by RX_DISPATCH FSM
63    NIC_G_NPKT_RX_DISPATCH_BROADCAST = 40,  // number of broadcast RX packets received
64    NIC_G_NPKT_RX_DISPATCH_DST_FAIL  = 41,  // number of discarded RX packets DST MAC not found
65    NIC_G_NPKT_RX_DISPATCH_CH_FULL   = 42,  // number of discarded RX packets for channel full
66
67    NIC_G_NPKT_TX_DISPATCH_RECEIVED  = 43,  // number of packets received by TX_DISPATCH FSM
68    NIC_G_NPKT_TX_DISPATCH_TOO_SMALL = 44,  // number of discarded too small TX packets (<60B)
69    NIC_G_NPKT_TX_DISPATCH_TOO_BIG   = 45,  // number of discarded too big TX packets (>1514B)
70    NIC_G_NPKT_TX_DISPATCH_SRC_FAIL  = 46,  // number of discarded TX packets SRC MAC failed
71    NIC_G_NPKT_TX_DISPATCH_BROADCAST = 47,  // number of broadcast TX packets received
72    NIC_G_NPKT_TX_DISPATCH_BYPASS    = 48,  // number of bypassed TX->RX packets
73    NIC_G_NPKT_TX_DISPATCH_TRANSMIT  = 49,  // number of transmit TX packets
74
75    NIC_CHANNEL_SPAN                 = 0x2000,
76};
77
78//////////////////////////////////////////////////////////////////////////////////////////////
79//            Channel Addressable Registers
80// A buffer descriptor occupies 64 bytes, but only 8 bytes (two 32 bits words) are useful:
81// LOW WORD   contains the 32 LSB bits of the buffer paddr               
82// HIGH WORD  contains the 16 MSB bits of the buffer paddr, plus status (bit 31)
83//////////////////////////////////////////////////////////////////////////////////////////////
84
85enum SoclibMultiNicChannelRegisters
86{
87    NIC_RX_DESC_LO_0          = 0,   // RX_0 descriptor low word         (Read/Write)
88    NIC_RX_DESC_HI_0          = 1,   // RX_0 descriptor high word        (Read/Write)
89    NIC_RX_DESC_LO_1          = 16,  // RX_1 descriptor low word         (Read/Write)
90    NIC_RX_DESC_HI_1          = 17,  // RX_1 descriptor high word        (Read/Write)
91    NIC_TX_DESC_LO_0          = 32,  // TX_0 descriptor low word         (Read/Write)
92    NIC_TX_DESC_HI_0          = 33,  // TX_0 descriptor high word        (Read/Write)
93    NIC_TX_DESC_LO_1          = 48,  // TX_1 descriptor low word         (Read/Write)
94    NIC_TX_DESC_HI_1          = 49,  // TX_1 descriptor high word        (Read/Write)
95    NIC_MAC_4                 = 64,  // channel mac address 32 LSB bits  (Read Only)
96    NIC_MAC_2                 = 65,  // channel mac address 16 LSB bits  (Read Only)
97    NIC_RX_RUN                = 66,  // RX packets can be received       (write_only)
98    NIC_TX_RUN                = 67,  // TX packets can be transmitted    (write_only)
99};
100
101
102///////////////////////////////////////////////////////////////////////////////////
103//              Initialization functions
104///////////////////////////////////////////////////////////////////////////////////
105
106extern unsigned int _nic_get_channel_register( unsigned int channel,
107                                               unsigned int index );
108
109extern void _nic_set_channel_register( unsigned int channel,
110                                       unsigned int index,
111                                       unsigned int value );
112
113extern unsigned int _nic_get_global_register( unsigned int index );
114
115extern void _nic_set_global_register( unsigned int index,
116                                      unsigned int value );
117
118extern int _nic_global_init( unsigned int bc_enable,
119                             unsigned int bypass_enable,
120                             unsigned int tdm_enable,
121                             unsigned int tdm_period );
122
123extern int _nic_channel_start( unsigned int channel,
124                               unsigned int is_rx,
125                               unsigned int mac4,
126                               unsigned int mac2 );
127
128extern int _nic_channel_stop( unsigned int channel,
129                              unsigned int is_rx );
130
131
132///////////////////////////////////////////////////////////////////////////////////
133//              Interrupt Service Routines
134///////////////////////////////////////////////////////////////////////////////////
135
136extern void _nic_rx_isr( unsigned int irq_type,
137                         unsigned int irq_id,
138                         unsigned int channel );
139
140extern void _nic_tx_isr( unsigned int irq_type,
141                         unsigned int irq_id,
142                         unsigned int channel );
143
144
145
146#endif
147
148// Local Variables:
149// tab-width: 4
150// c-basic-offset: 4
151// c-file-offsets:((innamespace . 0)(inline-open . 0))
152// indent-tabs-mode: nil
153// End:
154// vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
155
Note: See TracBrowser for help on using the repository browser.