eeprom.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:12k
源码类别:

Linux/Unix编程

开发平台:

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.  * Public interface for reading Atmel EEPROMs via L1 system controllers
  8.  *
  9.  * Copyright (C) 1992 - 1997, 2000-2002 Silicon Graphics, Inc. All rights reserved.
  10.  */
  11. #ifndef _ASM_IA64_SN_EEPROM_H
  12. #define _ASM_IA64_SN_EEPROM_H
  13. #include <asm/sn/sgi.h>
  14. #include <asm/sn/vector.h>
  15. #include <asm/sn/xtalk/xbow.h>
  16. #include <asm/sn/pci/bridge.h>
  17. #include <asm/sn/nic.h>
  18. /*
  19.  * The following structures are an implementation of the EEPROM info
  20.  * areas described in the SN1 EEPROM spec and the IPMI FRU Information
  21.  * Storage definition
  22.  */
  23. /* Maximum lengths for EEPROM fields
  24.  */
  25. #define EEPROM_PARTNUM_LEN 20
  26. #define EEPROM_SERNUM_LEN 10
  27. #define EEPROM_MANUF_NAME_LEN 10
  28. #define EEPROM_PROD_NAME_LEN 14
  29. /* The EEPROM "common header", which contains offsets to the other
  30.  * info areas in the EEPROM
  31.  */
  32. typedef struct eeprom_common_hdr_t
  33. {
  34.     uchar_t format; /* common header format byte */
  35.     uchar_t internal_use; /* offsets to various info areas */
  36.     uchar_t chassis; /*  (in doubleword units)        */
  37.     uchar_t board;
  38.     uchar_t product;
  39.     uchar_t multi_record;
  40.     uchar_t pad;
  41.     uchar_t checksum;
  42. } eeprom_common_hdr_t;
  43. /* The chassis (brick) info area 
  44.  */
  45. typedef struct eeprom_chassis_ia_t
  46. {
  47.     uchar_t format; /* format byte */
  48.     uchar_t length; /* info area length in doublewords */
  49.     uchar_t type; /* chassis type (always 0x17 "rack mount") */
  50.     uchar_t part_num_tl; /* type/length of part number field */
  51.     char part_num[EEPROM_PARTNUM_LEN];
  52.      /* ASCII part number */
  53.     uchar_t serial_num_tl; /* type/length of serial number field */
  54.     char serial_num[EEPROM_SERNUM_LEN];
  55.      /* ASCII serial number */
  56.     uchar_t checksum;
  57. } eeprom_chassis_ia_t;
  58. /* The board info area
  59.  */
  60. typedef struct eeprom_board_ia_t
  61. {
  62.     uchar_t       format;         /* format byte */
  63.     uchar_t       length;         /* info area length in doublewords */
  64.     uchar_t language; /* language code, always 0x00 "English" */
  65.     int mfg_date; /* date & time of manufacture, in minutes
  66.     since 0:00 1/1/96 */
  67.     uchar_t manuf_tl; /* type/length of manufacturer name field */
  68.     char manuf[EEPROM_MANUF_NAME_LEN];
  69. /* ASCII manufacturer name */
  70.     uchar_t product_tl; /* type/length of product name field */
  71.     char product[EEPROM_PROD_NAME_LEN];
  72. /* ASCII product name */
  73.     uchar_t serial_num_tl; /* type/length of board serial number */
  74.     char serial_num[EEPROM_SERNUM_LEN];
  75. /* ASCII serial number */
  76.     uchar_t part_num_tl; /* type/length of board part number */
  77.     char part_num[EEPROM_PARTNUM_LEN];
  78. /* ASCII part number */
  79.     /*
  80.      * "custom" fields -- see SN1 EEPROM Spec
  81.      */
  82.     uchar_t board_rev_tl; /* type/length of board rev (always 0xC2) */
  83.     char board_rev[2]; /* ASCII board revision */
  84.     uchar_t eeprom_size_tl; /* type/length of eeprom size field */
  85.     uchar_t eeprom_size; /* size code for eeprom */
  86.     uchar_t temp_waiver_tl; /* type/length of temp waiver field (0xC2) */
  87.     char temp_waiver[2]; /* temp waiver */
  88.     
  89.     /*
  90.      * these fields only appear in main boards' EEPROMs
  91.      */
  92.     uchar_t ekey_G_tl; /* type/length of encryption key "G" */
  93.     uint32_t ekey_G; /* encryption key "G" */
  94.     uchar_t ekey_P_tl; /* type/length of encryption key "P" */
  95.     uint32_t ekey_P; /* encryption key "P" */
  96.     uchar_t ekey_Y_tl; /* type/length of encryption key "Y" */
  97.     uint32_t ekey_Y; /* encryption key "Y" */
  98.     
  99.     /*
  100.      * these fields are used for I bricks only
  101.      */
  102.     uchar_t mac_addr_tl;   /* type/length of MAC address */
  103.     char mac_addr[12];   /* MAC address */
  104.     uchar_t ieee1394_cfg_tl;  /* type/length of IEEE 1394 info */
  105.     uchar_t ieee1394_cfg[32]; /* IEEE 1394 config info */
  106.     
  107.     /*
  108.      * all boards have a checksum
  109.      */
  110.     uchar_t checksum;
  111. } eeprom_board_ia_t;
  112. /* given a pointer to the three-byte little-endian EEPROM representation
  113.  * of date-of-manufacture, this function translates to a big-endian
  114.  * integer format
  115.  */
  116. int eeprom_xlate_board_mfr_date( uchar_t *src );
  117. /* EEPROM Serial Presence Detect record (used for DIMMs in IP35)
  118.  */
  119. typedef struct eeprom_spd_t
  120. {
  121.     /* 0*/ uchar_t spd_used; /* # of bytes written to serial memory by manufacturer */
  122.     /* 1*/ uchar_t spd_size; /* Total # of bytes of SPD memory device */
  123.     /* 2*/ uchar_t mem_type; /* Fundamental memory type (FPM, EDO, SDRAM..) */
  124.     /* 3*/ uchar_t num_rows; /* # of row addresses on this assembly */
  125.     /* 4*/ uchar_t num_cols; /* # Column Addresses on this assembly */
  126.     /* 5*/ uchar_t mod_rows; /* # Module Rows on this assembly */
  127.     /* 6*/ uchar_t data_width[2]; /* Data Width of this assembly (16b little-endian) */
  128.     /* 8*/ uchar_t volt_if; /* Voltage interface standard of this assembly */
  129.     /* 9*/ uchar_t cyc_time; /* SDRAM Cycle time, CL=X (highest CAS latency) */
  130.     /* A*/ uchar_t acc_time; /* SDRAM Access from Clock (highest CAS latency) */
  131.     /* B*/ uchar_t dimm_cfg; /* DIMM Configuration type (non-parity, ECC) */
  132.     /* C*/ uchar_t refresh_rt; /* Refresh Rate/Type */
  133.     /* D*/ uchar_t prim_width; /* Primary SDRAM Width */
  134.     /* E*/ uchar_t ec_width; /* Error Checking SDRAM width */
  135.     /* F*/ uchar_t min_delay; /* Min Clock Delay Back to Back Random Col Address */
  136.     /*10*/ uchar_t burst_len; /* Burst Lengths Supported */
  137.     /*11*/ uchar_t num_banks; /* # of Banks on Each SDRAM Device */
  138.     /*12*/ uchar_t cas_latencies; /* CAS# Latencies Supported */
  139.     /*13*/ uchar_t cs_latencies; /* CS# Latencies Supported */
  140.     /*14*/ uchar_t we_latencies; /* Write Latencies Supported */
  141.     /*15*/ uchar_t mod_attrib; /* SDRAM Module Attributes */
  142.     /*16*/ uchar_t dev_attrib; /* SDRAM Device Attributes: General */
  143.     /*17*/ uchar_t cyc_time2; /* Min SDRAM Cycle time at CL X-1 (2nd highest CAS latency) */
  144.     /*18*/ uchar_t acc_time2; /* SDRAM Access from Clock at CL X-1 (2nd highest CAS latency) */
  145.     /*19*/ uchar_t cyc_time3; /* Min SDRAM Cycle time at CL X-2 (3rd highest CAS latency) */
  146.     /*1A*/ uchar_t acc_time3; /* Max SDRAM Access from Clock at CL X-2 (3nd highest CAS latency) */
  147.     /*1B*/ uchar_t min_row_prechg; /* Min Row Precharge Time (Trp) */
  148.     /*1C*/ uchar_t min_ra_to_ra; /* Min Row Active to Row Active (Trrd) */
  149.     /*1D*/ uchar_t min_ras_to_cas; /* Min RAS to CAS Delay (Trcd) */
  150.     /*1E*/ uchar_t min_ras_pulse; /* Minimum RAS Pulse Width (Tras) */
  151.     /*1F*/ uchar_t row_density; /* Density of each row on module */
  152.     /*20*/ uchar_t ca_setup; /* Command and Address signal input setup time */
  153.     /*21*/ uchar_t ca_hold; /* Command and Address signal input hold time */
  154.     /*22*/ uchar_t d_setup; /* Data signal input setup time */
  155.     /*23*/ uchar_t d_hold; /* Data signal input hold time */
  156.     /*24*/ uchar_t pad0[26]; /* unused */
  157.     
  158.     /*3E*/ uchar_t data_rev; /* SPD Data Revision Code */
  159.     /*3F*/ uchar_t checksum; /* Checksum for bytes 0-62 */
  160.     /*40*/ uchar_t jedec_id[8]; /* Manufacturer's JEDEC ID code */
  161.     
  162.     /*48*/ uchar_t mfg_loc; /* Manufacturing Location */
  163.     /*49*/ uchar_t part_num[18]; /* Manufacturer's Part Number */
  164.     /*5B*/ uchar_t rev_code[2]; /* Revision Code */
  165.     /*5D*/ uchar_t mfg_date[2]; /* Manufacturing Date */
  166.     /*5F*/ uchar_t ser_num[4]; /* Assembly Serial Number */
  167.     /*63*/ uchar_t manuf_data[27]; /* Manufacturer Specific Data */
  168.     /*7E*/ uchar_t intel_freq; /* Intel specification frequency */
  169.     /*7F*/ uchar_t intel_100MHz; /* Intel spec details for 100MHz support */
  170. } eeprom_spd_t;
  171. #define EEPROM_SPD_RECORD_MAXLEN 256
  172. typedef union eeprom_spd_u
  173. {
  174.     eeprom_spd_t fields;
  175.     char         bytes[EEPROM_SPD_RECORD_MAXLEN];
  176. } eeprom_spd_u;
  177. /* EEPROM board record
  178.  */
  179. typedef struct eeprom_brd_record_t 
  180. {
  181.     eeprom_chassis_ia_t *chassis_ia;
  182.     eeprom_board_ia_t *board_ia;
  183.     eeprom_spd_u *spd;
  184. } eeprom_brd_record_t;
  185. /* End-of-fields marker
  186.  */
  187. #define EEPROM_EOF         0xc1
  188. /* masks for dissecting the type/length bytes
  189.  */
  190. #define FIELD_FORMAT_MASK       0xc0
  191. #define FIELD_LENGTH_MASK       0x3f
  192. /* field format codes (used in type/length bytes)
  193.  */
  194. #define FIELD_FORMAT_BINARY     0x00 /* binary format */
  195. #define FIELD_FORMAT_BCD        0x40 /* BCD */
  196. #define FIELD_FORMAT_PACKED     0x80 /* packed 6-bit ASCII */
  197. #define FIELD_FORMAT_ASCII      0xC0 /* 8-bit ASCII */
  198. /* codes specifying brick and board type
  199.  */
  200. #define C_BRICK 0x100
  201. #define C_PIMM (C_BRICK | 0x10)
  202. #define C_PIMM_0 (C_PIMM) /* | 0x0 */
  203. #define C_PIMM_1 (C_PIMM | 0x1)
  204. #define C_DIMM (C_BRICK | 0x20)
  205. #define C_DIMM_0 (C_DIMM) /* | 0x0 */
  206. #define C_DIMM_1 (C_DIMM | 0x1)
  207. #define C_DIMM_2 (C_DIMM | 0x2)
  208. #define C_DIMM_3 (C_DIMM | 0x3)
  209. #define C_DIMM_4 (C_DIMM | 0x4)
  210. #define C_DIMM_5 (C_DIMM | 0x5)
  211. #define C_DIMM_6 (C_DIMM | 0x6)
  212. #define C_DIMM_7 (C_DIMM | 0x7)
  213. #define R_BRICK 0x200
  214. #define R_POWER (R_BRICK | 0x10)
  215. #define VECTOR 0x300 /* used in vector ops when the destination
  216.        * could be a cbrick or an rbrick */
  217. #define IO_BRICK 0x400
  218. #define IO_POWER (IO_BRICK | 0x10)
  219. #define BRICK_MASK 0xf00
  220. #define SUBORD_MASK 0xf0  /* AND with component specification; if the
  221.          the result is non-zero, then the component
  222.          is a subordinate board of some kind */
  223. #define COMPT_MASK 0xf   /* if there's more than one instance of a
  224.  particular type of subordinate board, this 
  225.  masks out which one we're talking about */
  226. /* functions & macros for obtaining "NIC-like" strings from EEPROMs
  227.  */
  228. int eeprom_str( char *nic_str, nasid_t nasid, int component );
  229. int vector_eeprom_str( char *nic_str, nasid_t nasid,
  230.        int component, net_vec_t path );
  231. #define CBRICK_EEPROM_STR(s,n) eeprom_str((s),(n),C_BRICK)
  232. #define IOBRICK_EEPROM_STR(s,n) eeprom_str((s),(n),IO_BRICK)
  233. #define RBRICK_EEPROM_STR(s,n,p)  vector_eeprom_str((s),(n),R_BRICK,p)
  234. #define VECTOR_EEPROM_STR(s,n,p)  vector_eeprom_str((s),(n),VECTOR,p)
  235. /* functions for obtaining formatted records from EEPROMs
  236.  */
  237. int cbrick_eeprom_read( eeprom_brd_record_t *buf, nasid_t nasid,
  238. int component );
  239. int iobrick_eeprom_read( eeprom_brd_record_t *buf, nasid_t nasid,
  240.  int component );
  241. int vector_eeprom_read( eeprom_brd_record_t *buf, nasid_t nasid,
  242. net_vec_t path, int component );
  243. /* functions providing unique id's for duplonet and i/o discovery
  244.  */
  245. int cbrick_uid_get( nasid_t nasid, uint64_t *uid );
  246. int rbrick_uid_get( nasid_t nasid, net_vec_t path, uint64_t *uid );
  247. int iobrick_uid_get( nasid_t nasid, uint64_t *uid );
  248. /* retrieve the ethernet MAC address for an I-brick
  249.  */
  250. int ibrick_mac_addr_get( nasid_t nasid, char *eaddr );
  251. /* error codes
  252.  */
  253. #define EEP_OK 0
  254. #define EEP_L1 1
  255. #define EEP_FAIL 2
  256. #define EEP_BAD_CHECKSUM 3
  257. #define EEP_NICIFY 4
  258. #define EEP_PARAM 6
  259. #define EEP_NOMEM 7
  260. /* given a hardware graph vertex and an indication of the brick type,
  261.  * brick and board to be read, this functions reads the eeprom and
  262.  * attaches a "NIC"-format string of manufacturing information to the 
  263.  * vertex.  If the vertex already has the string, just returns the
  264.  * string.  If component is not VECTOR or R_BRICK, the path parameter
  265.  * is ignored.
  266.  */
  267. #ifdef LATER
  268. char *eeprom_vertex_info_set( int component, int nasid, devfs_handle_t v,
  269.       net_vec_t path );
  270. #endif
  271. /* We may need to differentiate between an XBridge and other types of
  272.  * bridges during discovery to tell whether the bridge in question
  273.  * is part of an IO brick.  The following function reads the WIDGET_ID
  274.  * register of the bridge under examination and returns a positive value
  275.  * if the part and mfg numbers stored there indicate that this widget
  276.  * is an XBridge (and so must be part of a brick).
  277.  */
  278. #ifdef LATER
  279. int is_iobrick( int nasid, int widget_num );
  280. #endif
  281. /* the following macro derives the widget number from the register
  282.  * address passed to it and uses is_iobrick to determine whether
  283.  * the widget in question is part of an SN1 IO brick.
  284.  */
  285. #define IS_IOBRICK(rg) is_iobrick( NASID_GET((rg)), SWIN_WIDGETNUM((rg)) )
  286. /* macros for NIC compatability */
  287. /* always invoked on "this" cbrick */
  288. #define HUB_VERTEX_MFG_INFO(v) 
  289.     eeprom_vertex_info_set( C_BRICK, get_nasid(), (v), 0 )
  290. #define BRIDGE_VERTEX_MFG_INFO(v, r) 
  291.     ( IS_IOBRICK((r)) ? eeprom_vertex_info_set 
  292.           ( IO_BRICK, NASID_GET((r)), (v), 0 ) 
  293.       : nic_bridge_vertex_info((v), (r)) )
  294. #define HUB_UID_GET(n,v,p) cbrick_uid_get((n),(p))
  295. #define ROUTER_UID_GET(d,p) rbrick_uid_get(get_nasid(),(d),(p))
  296. #define XBOW_UID_GET(n,p) iobrick_uid_get((n),(p))
  297. #endif /* _ASM_IA64_SN_EEPROM_H */