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 */