l1.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:12k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id$
  2.  *
  3.  * This file is subject to the terms and conditions of the GNU General Public
  4.  * License.  See the file "COPYING" in the main directory of this archive
  5.  * for more details.
  6.  *
  7.  * Copyright (C) 1992 - 1997, 2000 Silicon Graphics, Inc.
  8.  * Copyright (C) 2000 by Colin Ngam
  9.  */
  10. #ifndef _ASM_SN_KSYS_L1_H
  11. #define _ASM_SN_KSYS_L1_H
  12. #include <asm/sn/vector.h>
  13. #include <asm/sn/addrs.h>
  14. #include <asm/sn/sn1/bedrock.h>
  15. #define BRL1_QSIZE 128 /* power of 2 is more efficient */
  16. #define BRL1_BUFSZ 264 /* needs to be large enough
  17.  * to hold 2 flags, escaped
  18.  * CRC, type/subchannel byte,
  19.  * and escaped payload
  20.  */
  21. #define BRL1_IQS          32
  22. #define BRL1_OQS          4
  23. typedef struct sc_cq_s {
  24.     u_char              buf[BRL1_QSIZE];
  25.     int                 ipos, opos, tent_next;
  26. } sc_cq_t;
  27. /* An l1sc_t struct can be associated with the local (C-brick) L1 or an L1
  28.  * on an R-brick.  In the R-brick case, the l1sc_t records a vector path
  29.  * to the R-brick's junk bus UART.  In the C-brick case, we just use the
  30.  * following flag to denote the local uart.
  31.  *
  32.  * This value can't be confused with a network vector because the least-
  33.  * significant nibble of a network vector cannot be greater than 8.
  34.  */
  35. #define BRL1_LOCALUART ((net_vec_t)0xf)
  36. /* L1<->Bedrock reserved subchannels */
  37. /* console channels */
  38. #define SC_CONS_CPU0    0x00
  39. #define SC_CONS_CPU1    0x01
  40. #define SC_CONS_CPU2    0x02
  41. #define SC_CONS_CPU3    0x03
  42. #define L1_ELSCUART_SUBCH(p) (p)
  43. #define L1_ELSCUART_CPU(ch) (ch)
  44. #define SC_CONS_SYSTEM  CPUS_PER_NODE
  45. /* mapping subchannels to queues */
  46. #define MAP_IQ(s)       (s)
  47. #define MAP_OQ(s)       (s)
  48.      
  49. #define BRL1_NUM_SUBCHANS 32
  50. #define BRL1_CMD_SUBCH   16
  51. #define BRL1_EVENT_SUBCH  (BRL1_NUM_SUBCHANS - 1)
  52. #define BRL1_SUBCH_RSVD   0
  53. #define BRL1_SUBCH_FREE   (-1)
  54. /* constants for L1 hwgraph vertex info */
  55. #define CBRICK_L1 (__psint_t)1
  56. #define IOBRICK_L1 (__psint_t)2
  57. #define RBRICK_L1 (__psint_t)3
  58. struct l1sc_s;     
  59. typedef void (*brl1_notif_t)(struct l1sc_s *, int);
  60. typedef int  (*brl1_uartf_t)(struct l1sc_s *);
  61. /* structure for controlling a subchannel */
  62. typedef struct brl1_sch_s {
  63.     int use; /* if this subchannel is free,
  64.  * use == BRL1_SUBCH_FREE */
  65.     uint target; /* type, rack and slot of component to
  66.  * which this subchannel is directed */
  67.     atomic_t packet_arrived; /* true if packet arrived on
  68.  * this subchannel */
  69.     sc_cq_t * iqp; /* input queue for this subchannel */
  70.     sv_t arrive_sv; /* used to wait for a packet */
  71.     spinlock_t data_lock; /* synchronize access to input queues and
  72.  * other fields of the brl1_sch_s struct */
  73.     brl1_notif_t tx_notify;     /* notify higher layer that transmission may 
  74.  * continue */
  75.     brl1_notif_t rx_notify; /* notify higher layer that a packet has been
  76.  * received */
  77. } brl1_sch_t;
  78. /* br<->l1 protocol states */
  79. #define BRL1_IDLE 0
  80. #define BRL1_FLAG 1
  81. #define BRL1_HDR 2
  82. #define BRL1_BODY 3
  83. #define BRL1_ESC 4
  84. #define BRL1_RESET 7
  85. #ifndef _LANGUAGE_ASSEMBLY
  86. /*
  87.  * l1sc_t structure-- tracks protocol state, open subchannels, etc.
  88.  */
  89. typedef struct l1sc_s {
  90.     nasid_t  nasid; /* nasid with which this instance
  91.  * of the structure is associated */
  92.     moduleid_t  modid;         /* module id of this brick */
  93.     u_char  verbose; /* non-zero if elscuart routines should
  94.  * prefix output */
  95.     net_vec_t    uart; /* vector path to UART, or BRL1_LOCALUART */
  96.     int  sent; /* number of characters sent */
  97.     int  send_len; /* number of characters in send buf */
  98.     brl1_uartf_t putc_f; /* pointer to UART putc function */
  99.     brl1_uartf_t getc_f; /* pointer to UART getc function */
  100.     spinlock_t  subch_lock; /* arbitrates subchannel allocation */
  101.     cpuid_t  intr_cpu; /* cpu that receives L1 interrupts */
  102.     u_char  send_in_use; /* non-zero if send buffer contains an
  103.  * unsent or partially-sent  packet */
  104.     u_char  fifo_space; /* current depth of UART send FIFO */
  105.     u_char  brl1_state; /* current state of the receive side */
  106.     u_char  brl1_last_hdr; /* last header byte received */
  107.     char  send[BRL1_BUFSZ]; /* send buffer */
  108.     int  sol; /* "start of line" (see elscuart routines) */
  109.     int  cons_listen; /* non-zero if the elscuart interface should
  110.  * also check the system console subchannel */
  111.     brl1_sch_t  subch[BRL1_NUM_SUBCHANS];
  112.      /* subchannels provided by link */
  113.     sc_cq_t  garbage_q; /* a place to put unsolicited packets */
  114.     sc_cq_t  oq[BRL1_OQS]; /* elscuart output queues */
  115. } l1sc_t;
  116. /* error codes */
  117. #define BRL1_VALID   0
  118. #define BRL1_FULL_Q (-1)
  119. #define BRL1_CRC (-2)
  120. #define BRL1_PROTOCOL (-3)
  121. #define BRL1_NO_MESSAGE (-4)
  122. #define BRL1_LINK (-5)
  123. #define BRL1_BUSY (-6)
  124. #define SC_SUCCESS      BRL1_VALID
  125. #define SC_NMSG         BRL1_NO_MESSAGE
  126. #define SC_BUSY         BRL1_BUSY
  127. #define SC_NOPEN        (-7)
  128. #define SC_BADSUBCH     (-8)
  129. #define SC_TIMEDOUT (-9)
  130. #define SC_NSUBCH (-10)
  131. /* L1 Target Addresses */
  132. /*
  133.  * L1 commands and responses use source/target addresses that are
  134.  * 32 bits long.  These are broken up into multiple bitfields that
  135.  * specify the type of the target controller (could actually be L2
  136.  * L3, not just L1), the rack and bay of the target, and the task
  137.  * id (L1 functionality is divided into several independent "tasks"
  138.  * that can each receive command requests and transmit responses)
  139.  */
  140. #define L1_ADDR_TYPE_SHFT 28
  141. #define L1_ADDR_TYPE_MASK 0xF0000000
  142. #define L1_ADDR_TYPE_L1 0x00 /* L1 system controller */
  143. #define L1_ADDR_TYPE_L2 0x01 /* L2 system controller */
  144. #define L1_ADDR_TYPE_L3 0x02 /* L3 system controller */
  145. #define L1_ADDR_TYPE_CBRICK 0x03 /* attached C brick */
  146. #define L1_ADDR_TYPE_IOBRICK 0x04 /* attached I/O brick */
  147. #define L1_ADDR_RACK_SHFT 18
  148. #define L1_ADDR_RACK_MASK 0x0FFC0000
  149. #define L1_ADDR_RACK_LOCAL 0x3ff /* local brick's rack */
  150. #define L1_ADDR_BAY_SHFT 12
  151. #define L1_ADDR_BAY_MASK 0x0003F000
  152. #define L1_ADDR_BAY_LOCAL 0x3f /* local brick's bay */
  153. #define L1_ADDR_TASK_SHFT 0
  154. #define L1_ADDR_TASK_MASK 0x0000001F
  155. #define L1_ADDR_TASK_INVALID 0x00 /* invalid task  */
  156. #define L1_ADDR_TASK_IROUTER 0x01 /* iRouter */
  157. #define L1_ADDR_TASK_SYS_MGMT 0x02 /* system management port */
  158. #define L1_ADDR_TASK_CMD 0x03 /* command interpreter */
  159. #define L1_ADDR_TASK_ENV 0x04 /* environmental monitor */
  160. #define L1_ADDR_TASK_BEDROCK 0x05 /* bedrock */
  161. #define L1_ADDR_TASK_GENERAL 0x06 /* general requests */
  162. #define L1_ADDR_LOCAL
  163.     (L1_ADDR_TYPE_L1 << L1_ADDR_TYPE_SHFT) |
  164.     (L1_ADDR_RACK_LOCAL << L1_ADDR_RACK_SHFT) |
  165.     (L1_ADDR_BAY_LOCAL << L1_ADDR_BAY_SHFT)
  166. #define L1_ADDR_LOCALIO
  167.     (L1_ADDR_TYPE_IOBRICK << L1_ADDR_TYPE_SHFT) |
  168.     (L1_ADDR_RACK_LOCAL << L1_ADDR_RACK_SHFT) |
  169.     (L1_ADDR_BAY_LOCAL << L1_ADDR_BAY_SHFT)
  170. #define L1_ADDR_LOCAL_SHFT L1_ADDR_BAY_SHFT
  171. /* response argument types */
  172. #define L1_ARG_INT 0x00 /* 4-byte integer (big-endian) */
  173. #define L1_ARG_ASCII 0x01 /* null-terminated ASCII string */
  174. #define L1_ARG_UNKNOWN 0x80 /* unknown data type.  The low
  175.  * 7 bits will contain the data
  176.  * length. */
  177. /* response codes */
  178. #define L1_RESP_OK     0 /* no problems encountered      */
  179. #define L1_RESP_IROUTER (-  1) /* iRouter error         */
  180. #define L1_RESP_ARGC (-100) /* arg count mismatch         */
  181. #define L1_RESP_REQC (-101) /* bad request code         */
  182. #define L1_RESP_NAVAIL (-104) /* requested data not available */
  183. #define L1_RESP_ARGVAL (-105)  /* arg value out of range       */
  184. #define L1_RESP_INVAL   (-107)  /* requested data invalid       */
  185. /* L1 general requests */
  186. /* request codes */
  187. #define L1_REQ_RDBG 0x0001 /* read debug switches */
  188. #define L1_REQ_RRACK 0x0002 /* read brick rack & bay */
  189. #define L1_REQ_RRBT 0x0003  /* read brick rack, bay & type */
  190. #define L1_REQ_SER_NUM 0x0004  /* read brick serial number */
  191. #define L1_REQ_FW_REV 0x0005  /* read L1 firmware revision */
  192. #define L1_REQ_EEPROM 0x0006  /* read EEPROM info */
  193. #define L1_REQ_EEPROM_FMT 0x0007  /* get EEPROM data format & size */
  194. #define L1_REQ_SYS_SERIAL 0x0008 /* read system serial number */
  195. #define L1_REQ_PARTITION_GET 0x0009 /* read partition id */
  196. #define L1_REQ_PORTSPEED 0x000a /* get ioport speed */
  197. #define L1_REQ_CONS_SUBCH 0x1002  /* select this node's console 
  198.    subchannel */
  199. #define L1_REQ_CONS_NODE 0x1003  /* volunteer to be the master 
  200.    (console-hosting) node */
  201. #define L1_REQ_DISP1 0x1004  /* write line 1 of L1 display */
  202. #define L1_REQ_DISP2 0x1005  /* write line 2 of L1 display */
  203. #define L1_REQ_PARTITION_SET 0x1006 /* set partition id */
  204. #define L1_REQ_EVENT_SUBCH 0x1007 /* set the subchannel for system
  205.    controller event transmission */
  206. #define L1_REQ_RESET 0x2000 /* request a full system reset */
  207. #define L1_REQ_PCI_UP 0x2001  /* power up pci slot or bus */
  208. #define L1_REQ_PCI_DOWN 0x2002  /* power down pci slot or bus */
  209. #define L1_REQ_PCI_RESET 0x2003  /* reset pci bus or slot */
  210. /* L1 command interpreter requests */
  211. /* request codes */
  212. #define L1_REQ_EXEC_CMD 0x0000 /* interpret and execute an ASCII
  213.    command string */
  214. /* brick type response codes */
  215. #define L1_BRICKTYPE_C 0x43
  216. #define L1_BRICKTYPE_I 0x49
  217. #define L1_BRICKTYPE_P 0x50
  218. #define L1_BRICKTYPE_R  0x52
  219. #define L1_BRICKTYPE_X  0x58
  220. /* EEPROM codes (for the "read EEPROM" request) */
  221. /* c brick */
  222. #define L1_EEP_NODE 0x00 /* node board */
  223. #define L1_EEP_PIMM0 0x01
  224. #define L1_EEP_PIMM(x) (L1_EEP_PIMM0+(x))
  225. #define L1_EEP_DIMM0 0x03
  226. #define L1_EEP_DIMM(x) (L1_EEP_DIMM0+(x))
  227. /* other brick types */
  228. #define L1_EEP_POWER 0x00 /* power board */
  229. #define L1_EEP_LOGIC 0x01 /* logic board */
  230. /* info area types */
  231. #define L1_EEP_CHASSIS 1 /* chassis info area */
  232. #define L1_EEP_BOARD 2 /* board info area */
  233. #define L1_EEP_IUSE 3 /* internal use area */
  234. #define L1_EEP_SPD 4 /* serial presence detect record */
  235. typedef uint32_t l1addr_t;
  236. #define L1_BUILD_ADDR(addr,at,r,s,t)
  237.     (*(l1addr_t *)(addr) = ((l1addr_t)(at) << L1_ADDR_TYPE_SHFT) |
  238.      ((l1addr_t)(r)  << L1_ADDR_RACK_SHFT) |
  239.      ((l1addr_t)(s)  << L1_ADDR_BAY_SHFT) |
  240.      ((l1addr_t)(t)  << L1_ADDR_TASK_SHFT))
  241. #define L1_ADDRESS_TO_TASK(addr,trb,tsk)
  242.     (*(l1addr_t *)(addr) = (l1addr_t)(trb) |
  243.           ((l1addr_t)(tsk) << L1_ADDR_TASK_SHFT))
  244. #define L1_DISPLAY_LINE_LENGTH 12 /* L1 display characters/line */
  245. #ifdef L1_DISP_2LINES
  246. #define L1_DISPLAY_LINES 2 /* number of L1 display lines */
  247. #else
  248. #define L1_DISPLAY_LINES 1 /* number of L1 display lines available
  249.  * to system software */
  250. #endif
  251. #define SC_EVENT_CLASS_MASK ((unsigned short)0xff00)
  252. #define bzero(d, n) memset((d), 0, (n))
  253. /* public interfaces to L1 system controller */
  254. int sc_open( l1sc_t *sc, uint target );
  255. int sc_close( l1sc_t *sc, int ch );
  256. int sc_construct_msg( l1sc_t *sc, int ch, 
  257.   char *msg, int msg_len,
  258.   uint addr_task, short req_code,
  259.   int req_nargs, ... );
  260. int sc_interpret_resp( char *resp, int resp_nargs, ... );
  261. int sc_send( l1sc_t *sc, int ch, char *msg, int len, int wait );
  262. int sc_recv( l1sc_t *sc, int ch, char *msg, int *len, uint64_t block );
  263. int sc_command( l1sc_t *sc, int ch, char *cmd, char *resp, int *len );
  264. int sc_command_kern( l1sc_t *sc, int ch, char *cmd, char *resp, int *len );
  265. int sc_poll( l1sc_t *sc, int ch );
  266. void sc_init( l1sc_t *sc, nasid_t nasid, net_vec_t uart );
  267. void sc_intr_enable( l1sc_t *sc );
  268. int _elscuart_putc( l1sc_t *sc, int c );
  269. int _elscuart_getc( l1sc_t *sc );
  270. int _elscuart_poll( l1sc_t *sc );
  271. int _elscuart_readc( l1sc_t *sc );
  272. int _elscuart_flush( l1sc_t *sc );
  273. int _elscuart_probe( l1sc_t *sc );
  274. void _elscuart_init( l1sc_t *sc );
  275. void elscuart_syscon_listen( l1sc_t *sc );
  276. int elsc_rack_bay_get(l1sc_t *e, uint *rack, uint *bay);
  277. int elsc_rack_bay_type_get(l1sc_t *e, uint *rack, 
  278.        uint *bay, uint *brick_type);
  279. int elsc_cons_subch(l1sc_t *e, uint ch);
  280. int elsc_cons_node(l1sc_t *e);
  281. int elsc_display_line(l1sc_t *e, char *line, int lnum);
  282. extern l1sc_t *get_elsc( void );
  283. #define get_l1sc get_elsc
  284. #define get_master_l1sc get_l1sc
  285. int router_module_get( nasid_t nasid, net_vec_t path );
  286. int iobrick_rack_bay_type_get( l1sc_t *sc, uint *rack,
  287.    uint *bay, uint *brick_type );
  288. int iobrick_module_get( l1sc_t *sc );
  289. int iobrick_pci_slot_pwr( l1sc_t *sc, int bus, int slot, int up );
  290. int iobrick_pci_bus_pwr( l1sc_t *sc, int bus, int up );
  291. int iobrick_sc_version( l1sc_t *sc, char *result );
  292. #endif /* !_LANGUAGE_ASSEMBLY */
  293. #endif /* _ASM_SN_KSYS_L1_H */