openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

verinet.h (8259B)


      1 /*
      2  * 
      3  * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file.
      4  * 
      5  * Copyright 2007-2019 Broadcom Inc. All rights reserved.
      6  *
      7  * File: 	verinet.h
      8  * Purpose: 	SAL PLI simulation definitions (Unix PLI sim only)
      9  */
     10 
     11 #ifndef _SAL_VERINET_H
     12 #define _SAL_VERINET_H
     13 
     14 #include <stdarg.h>
     15 #ifdef VXWORKS
     16 #include <sys/times.h>
     17 #else
     18 #include <sys/time.h>
     19 #endif
     20 
     21 #include <sal/types.h>
     22 #include <sal/core/thread.h>
     23 #include <sal/core/sync.h>
     24 
     25 #if !defined(_SOCKLEN_T) && !defined(__socklen_t_defined)
     26 typedef int socklen_t;
     27 #endif
     28 
     29 #define N_VERINET_DEVICES	16
     30 
     31 /*
     32  * Register types for PLI transactions
     33  */
     34 
     35 #define PCI_CONFIG		0xfeed1001
     36 #define PCI_MEMORY		0xfeed1002
     37 #define I2C_CONFIG		0xfeed1003
     38 #define PLI_CONFIG		0xfeed1004
     39 #define JTAG_CONFIG		0xfeed1005
     40 #define DMA_MEMORY		0xfeed1006
     41 #define SOC_INTERNAL		0xfeed1007
     42 #define PCI_SLAVE_MEMORY	0xfeed1008
     43 #define PHY_EXERNAL		0xfeed1009
     44 
     45 typedef void (*pli_isr_t)(void *isr_data);
     46 
     47 /*
     48  * Returned to PLI server code when a client connection is established.
     49  */
     50 
     51 typedef struct netconnection_t {
     52     int intsock;
     53     int dmasock;
     54     int piosock;
     55     uint32 inetaddr; 
     56 } netconnection_t;
     57 
     58 /*
     59  * PLI RPC command type: Format of RPC command messages.
     60  * All RPC messages from the SAL/testclient to the server (veriserv)
     61  * are of the following format.
     62  */
     63 
     64 #define MAX_RPC_ARGS   512 	/* DWORD ARG COUNT */
     65 
     66 typedef struct rpc_cmd_t {
     67     uint32  opcode;
     68     /* RPC OPCODES : Requests */
     69 #define   RPC_GETREG_REQ        0x101 
     70 #define   RPC_SETREG_REQ        0x102
     71 #define   RPC_IOCTL_REQ         0x103
     72 
     73     /* For PCI Interface */
     74 #define   RPC_PCI_CONFIG_GET    0x104
     75 #define   RPC_PCI_CONFIG_SET    0x105
     76 #define   RPC_PCI_MEMORY_GET    0x106
     77 #define   RPC_PCI_MEMORY_SET    0x107
     78 #define   RPC_DMAC_WRITE_REQ    0x108
     79 #define   RPC_DMAC_READ_REQ     0x109
     80 #define   RPC_SEND_INTR         0x110
     81 #define   RPC_PCI_CONDITION     0x111
     82 #define   RPC_REGISTER_CLIENT   0x112
     83 
     84     /* For I2C Interface */
     85 #define   RPC_I2C_CONDITION     0x113
     86 #define   RPC_I2C_BYTE_READ     0x114
     87 #define   RPC_I2C_BYTE_WRITE    0x115
     88 #define   RPC_I2C_ASSERT_ACK    0x116
     89 #define   RPC_I2C_CHECK_ACK     0x117
     90 #define   RPC_I2C_ASSERT_START  0x118
     91 #define   RPC_I2C_CHECK_START   0x119
     92 #define   RPC_I2C_ASSERT_STOP   0x120
     93 #define   RPC_I2C_CHECK_STOP    0x121
     94 
     95     /* For simulation data transfer */
     96 #define   RPC_PACKET_DATA_RAW   0x122
     97     /* First arg is data length in bytes; Data is packed into args */
     98     /* Currently supports up to 2 K */
     99 #define   RPC_PACKET_DESC       0x123
    100     /* Data is coded (described) in args */
    101 #define   RPC_SIM_WAIT          0x124
    102     /* Simulation should wait the specified number of usecs in arg 0. */
    103 
    104     /* Call test routine with packet data */
    105 #define   RPC_TEST_PKT          0x125
    106 #define   RPC_DMAC_WRITE_BYTES_REQ   0x126
    107 #define   RPC_DMAC_READ_BYTES_REQ    0x127
    108 #define   RPC_SCHAN_REQ         0x128
    109 
    110 #define   RPC_SHUTDOWN		0x3fd
    111 #define   RPC_TX_ENABLE		0x3fe
    112 #define   RPC_SEND_PACKET	0x3ff
    113 #define   RPC_DISCONNECT	0x400
    114 #define   RPC_TERMINATE		0x500
    115 
    116     /* RPC OPCODES: Responses */
    117 #define   RPC_GETREG_RESP       0x201 
    118 #define   RPC_SETREG_RESP       0x202
    119 #define   RPC_IOCTL_RESP        0x203
    120 #define   RPC_DMAC_READ_RESP    0x204
    121 #define   RPC_DMAC_WRITE_RESP   0x205
    122 #define   RPC_PACKET_RESP       0x206
    123 #define   RPC_SIM_WAIT_RESP     0x207
    124 #define   RPC_DMAC_WRITE_BYTES_RESP   0x208
    125 #define   RPC_DMAC_READ_BYTES_RESP    0x209
    126 #define   RPC_SCHAN_RESP        0x210
    127 
    128     uint32  argcount;
    129     uint32  args[MAX_RPC_ARGS];
    130 
    131     uint32  status;
    132     /* RPC STATUS CODES */
    133 #define   RPC_OK		0x300
    134 #define   RPC_OUTSTANDING	0x200
    135 #define   RPC_FAIL		0x100
    136 } rpc_cmd_t;
    137 
    138 /* Indicate opcodes that should use rpc string packing */
    139 #define RPC_OP_USE_STRING(op) \
    140    (((op) == RPC_DMAC_WRITE_BYTES_REQ)   || \
    141     ((op) == RPC_DMAC_READ_BYTES_REQ)    || \
    142     ((op) == RPC_DMAC_WRITE_BYTES_RESP)  || \
    143     ((op) == RPC_DMAC_READ_BYTES_RESP))
    144 
    145 /* Connection information maintained by PLI client */
    146 
    147 typedef struct verinet_t {
    148     int 		devNo;
    149 
    150     char 		pliHost[128];
    151     int 		pliPort;
    152     int 		intPort;
    153     int 		dmaPort;
    154     int 		skipTestInt;	/* skip test intr sent by plicode */
    155     int 		sockfd;		/* fd for socket conn. to simulator */
    156     int			jobsStarted;
    157 
    158     /*
    159      * pli_mutex is used by client routines so that multiple threads
    160      * may share the pli_setreg/pli_getreg calls.
    161      */
    162     sal_mutex_t 	pli_mutex;
    163 
    164     /*
    165      * DMAC
    166      */
    167 
    168     int 		dmacInited;
    169     sal_thread_t 	dmacListener;
    170     sal_thread_t 	dmacHandler;
    171     sal_sem_t 		dmacListening;
    172     volatile int 	dmacWorkerExit;
    173     int 		dmacFd;
    174 
    175     /*
    176      * INTR
    177      */
    178 
    179     int 		intrInited;
    180     sal_thread_t 	intrThread;
    181     sal_thread_t 	intrDispatchThread;
    182     sal_sem_t	 	intrDispatchSema;
    183     sal_sem_t	 	intrListening;
    184     int 		intrSkipTest;
    185     int 		intrFinished;
    186     sal_thread_t 	intrHandlerThread;
    187     volatile int 	intrWorkerExit;
    188     int			intrFd;
    189 
    190     pli_isr_t		ISR;
    191     void		*ISR_data;
    192 } verinet_t;
    193 
    194 extern verinet_t verinet[];
    195 
    196 /*
    197  * Network utility routines.
    198  */
    199 
    200 extern int writen(int fd, void* ptr, int nbytes);
    201 extern int readn(int fd, void* ptr, int nbytes);
    202 extern int get_command(int sockfd, struct timeval* tv, rpc_cmd_t* command);
    203 extern int wait_command(int sockfd, rpc_cmd_t* cmd);
    204 extern int poll_command(int sockfd, rpc_cmd_t* cmd);
    205 extern int write_command(int sockfd, rpc_cmd_t* command);
    206 extern int get_pkt_data(int sockfd, struct timeval* tv, uint32* data);
    207 extern void make_rpc(rpc_cmd_t* r, uint32 opcode, uint32 status,
    208 		     uint32 argcount, ...);
    209 extern int getsockport(int sock_fd);
    210 
    211 /*
    212  * RPC: requests.
    213  */
    214 
    215 extern void make_rpc_setreg_req(rpc_cmd_t* c,
    216 			 uint32 type, uint32 regnum, uint32 regval);
    217 extern void make_rpc_getreg_req(rpc_cmd_t* c,uint32 type, uint32 regnum);
    218 extern void make_rpc_disconnect_req(rpc_cmd_t* c);
    219 extern void make_rpc_setmem_req(rpc_cmd_t* c, uint32 addr, uint32 data);
    220 extern void make_rpc_getmem_req(rpc_cmd_t* c, uint32 addr);
    221 extern void make_rpc_intr_req(rpc_cmd_t* c, uint32 cause);
    222 extern void make_rpc_register_req(rpc_cmd_t* c,
    223 			   int intPort, int dmacPort, uint32 netAddr);
    224 
    225 /*
    226  * RPC: responses.
    227  */
    228 
    229 extern void make_rpc_getreg_resp(rpc_cmd_t* c,
    230 			  uint32 status, uint32 regval, char* buf32b);
    231 extern void make_rpc_setreg_resp(rpc_cmd_t* c, uint32 regval);
    232 extern void make_rpc_getmem_resp(rpc_cmd_t* c, uint32 data);
    233 extern void make_rpc_setmem_resp(rpc_cmd_t* c, uint32 data);
    234 extern void make_rpc_intr_resp(rpc_cmd_t* c, uint32 cause);
    235 extern void make_rpc_register_resp(rpc_cmd_t* c, uint32 status);
    236 
    237 
    238 /*
    239  * Server calls.
    240  */
    241 
    242 extern void disconnect(int sockfd);
    243 extern uint32 send_interrupt(int sockfd, uint32 cause);
    244 extern netconnection_t* register_client(int s, uint32 i,uint32 d,
    245                                         uint32 netaddr);
    246 extern int unregister_client(netconnection_t *);
    247 extern int dma_writemem(int sockfd, uint32 addr, uint32 data);
    248 extern int dma_readmem(int sockfd,uint32 addr, uint32 *value);
    249 int dma_write_bytes(int sockfd, uint32 addr, uint8 *data, int len);
    250 int dma_read_bytes(int sockfd, uint32 addr, uint8 *data, int len);
    251 
    252 /*
    253  * Client calls.
    254  */
    255 
    256 extern int pli_client_count(void);
    257 extern int pli_client_attach(int devNo);
    258 extern int pli_register_isr(int devNo, pli_isr_t isr, void *isr_data);
    259 extern uint32 pli_getreg(int devNo, uint32 regtype, uint32 regnum);
    260 extern uint32 pli_setreg(int devNo, uint32 regtype, uint32 regnum,
    261                          uint32 regval);
    262 extern int pli_client_detach(int devNo);
    263 
    264 /*
    265  * Support for genering fw packets with ncsim
    266  */
    267 
    268 extern uint32 pli_send_packet(int devNo, uint32,uint32,int,unsigned char *);
    269 extern uint32 pli_tx_enable(int devNo, uint32);
    270 extern uint32 pli_shutdown(int devNo);
    271 
    272 extern uint32 pli_sim_start(int devNo);
    273 
    274 /*
    275  * DMAC: DMA Controller (emulator)
    276  * See: sal/unix/dmac.c
    277  */
    278 
    279 extern int dmac_init(verinet_t *v);
    280 
    281 /*
    282  * INTC: Interrupt Controller
    283  * See: sal/unix/intr.c
    284  */
    285 
    286 extern int intr_init(verinet_t *v);
    287 extern void intr_set_vector(verinet_t *v, pli_isr_t isr, void *isr_data);
    288 extern void intr_handler(void *v_void);		/* verinet_t * */
    289 extern int intr_int_context(void);
    290   
    291 #endif	/* !_SAL_VERINET_H */