Stephen Hemminger | 5ad887f | 2007-09-15 19:35:14 -0400 | [diff] [blame] | 1 | /****************************************************************************** |
| 2 | * |
| 3 | * Name: skvpd.h |
| 4 | * Project: GEnesis, PCI Gigabit Ethernet Adapter |
| 5 | * Version: $Revision: 1.15 $ |
| 6 | * Date: $Date: 2003/01/13 10:39:38 $ |
| 7 | * Purpose: Defines and Macros for VPD handling |
| 8 | * |
| 9 | ******************************************************************************/ |
| 10 | |
| 11 | /****************************************************************************** |
| 12 | * |
| 13 | * (C)Copyright 1998-2003 SysKonnect GmbH. |
| 14 | * |
| 15 | * This program is free software; you can redistribute it and/or modify |
| 16 | * it under the terms of the GNU General Public License as published by |
| 17 | * the Free Software Foundation; either version 2 of the License, or |
| 18 | * (at your option) any later version. |
| 19 | * |
| 20 | * The information in this file is provided "AS IS" without warranty. |
| 21 | * |
| 22 | ******************************************************************************/ |
| 23 | |
| 24 | /* |
| 25 | * skvpd.h contains Diagnostic specific defines for VPD handling |
| 26 | */ |
| 27 | |
| 28 | #ifndef __INC_SKVPD_H_ |
| 29 | #define __INC_SKVPD_H_ |
| 30 | |
| 31 | /* |
| 32 | * Define Resource Type Identifiers and VPD keywords |
| 33 | */ |
| 34 | #define RES_ID 0x82 /* Resource Type ID String (Product Name) */ |
| 35 | #define RES_VPD_R 0x90 /* start of VPD read only area */ |
| 36 | #define RES_VPD_W 0x91 /* start of VPD read/write area */ |
| 37 | #define RES_END 0x78 /* Resource Type End Tag */ |
| 38 | |
| 39 | #ifndef VPD_NAME |
| 40 | #define VPD_NAME "Name" /* Product Name, VPD name of RES_ID */ |
| 41 | #endif /* VPD_NAME */ |
| 42 | #define VPD_PN "PN" /* Adapter Part Number */ |
| 43 | #define VPD_EC "EC" /* Adapter Engineering Level */ |
| 44 | #define VPD_MN "MN" /* Manufacture ID */ |
| 45 | #define VPD_SN "SN" /* Serial Number */ |
| 46 | #define VPD_CP "CP" /* Extended Capability */ |
| 47 | #define VPD_RV "RV" /* Checksum and Reserved */ |
| 48 | #define VPD_YA "YA" /* Asset Tag Identifier */ |
| 49 | #define VPD_VL "VL" /* First Error Log Message (SK specific) */ |
| 50 | #define VPD_VF "VF" /* Second Error Log Message (SK specific) */ |
| 51 | #define VPD_RW "RW" /* Remaining Read / Write Area */ |
| 52 | |
| 53 | /* 'type' values for vpd_setup_para() */ |
| 54 | #define VPD_RO_KEY 1 /* RO keys are "PN", "EC", "MN", "SN", "RV" */ |
| 55 | #define VPD_RW_KEY 2 /* RW keys are "Yx", "Vx", and "RW" */ |
| 56 | |
| 57 | /* 'op' values for vpd_setup_para() */ |
| 58 | #define ADD_KEY 1 /* add the key at the pos "RV" or "RW" */ |
| 59 | #define OWR_KEY 2 /* overwrite key if already exists */ |
| 60 | |
| 61 | /* |
| 62 | * Define READ and WRITE Constants. |
| 63 | */ |
| 64 | |
| 65 | #define VPD_DEV_ID_GENESIS 0x4300 |
| 66 | |
| 67 | #define VPD_SIZE_YUKON 256 |
| 68 | #define VPD_SIZE_GENESIS 512 |
| 69 | #define VPD_SIZE 512 |
| 70 | #define VPD_READ 0x0000 |
| 71 | #define VPD_WRITE 0x8000 |
| 72 | |
| 73 | #define VPD_STOP(pAC,IoC) VPD_OUT16(pAC,IoC,PCI_VPD_ADR_REG,VPD_WRITE) |
| 74 | |
| 75 | #define VPD_GET_RES_LEN(p) ((unsigned int) \ |
| 76 | (* (SK_U8 *)&(p)[1]) |\ |
| 77 | ((* (SK_U8 *)&(p)[2]) << 8)) |
| 78 | #define VPD_GET_VPD_LEN(p) ((unsigned int)(* (SK_U8 *)&(p)[2])) |
| 79 | #define VPD_GET_VAL(p) ((char *)&(p)[3]) |
| 80 | |
| 81 | #define VPD_MAX_LEN 50 |
| 82 | |
| 83 | /* VPD status */ |
| 84 | /* bit 7..1 reserved */ |
| 85 | #define VPD_VALID (1<<0) /* VPD data buffer, vpd_free_ro, */ |
| 86 | /* and vpd_free_rw valid */ |
| 87 | |
| 88 | /* |
| 89 | * VPD structs |
| 90 | */ |
| 91 | typedef struct s_vpd_status { |
| 92 | unsigned short Align01; /* Alignment */ |
| 93 | unsigned short vpd_status; /* VPD status, description see above */ |
| 94 | int vpd_free_ro; /* unused bytes in read only area */ |
| 95 | int vpd_free_rw; /* bytes available in read/write area */ |
| 96 | } SK_VPD_STATUS; |
| 97 | |
| 98 | typedef struct s_vpd { |
| 99 | SK_VPD_STATUS v; /* VPD status structure */ |
| 100 | char vpd_buf[VPD_SIZE]; /* VPD buffer */ |
| 101 | int rom_size; /* VPD ROM Size from PCI_OUR_REG_2 */ |
| 102 | int vpd_size; /* saved VPD-size */ |
| 103 | } SK_VPD; |
| 104 | |
| 105 | typedef struct s_vpd_para { |
| 106 | unsigned int p_len; /* parameter length */ |
| 107 | char *p_val; /* points to the value */ |
| 108 | } SK_VPD_PARA; |
| 109 | |
| 110 | /* |
| 111 | * structure of Large Resource Type Identifiers |
| 112 | */ |
| 113 | |
| 114 | /* was removed because of alignment problems */ |
| 115 | |
| 116 | /* |
| 117 | * structure of VPD keywords |
| 118 | */ |
| 119 | typedef struct s_vpd_key { |
| 120 | char p_key[2]; /* 2 bytes ID string */ |
| 121 | unsigned char p_len; /* 1 byte length */ |
| 122 | char p_val; /* start of the value string */ |
| 123 | } SK_VPD_KEY; |
| 124 | |
| 125 | |
| 126 | /* |
| 127 | * System specific VPD macros |
| 128 | */ |
| 129 | #ifndef SKDIAG |
| 130 | #ifndef VPD_DO_IO |
| 131 | #define VPD_OUT8(pAC,IoC,Addr,Val) (void)SkPciWriteCfgByte(pAC,Addr,Val) |
| 132 | #define VPD_OUT16(pAC,IoC,Addr,Val) (void)SkPciWriteCfgWord(pAC,Addr,Val) |
| 133 | #define VPD_IN8(pAC,IoC,Addr,pVal) (void)SkPciReadCfgByte(pAC,Addr,pVal) |
| 134 | #define VPD_IN16(pAC,IoC,Addr,pVal) (void)SkPciReadCfgWord(pAC,Addr,pVal) |
| 135 | #define VPD_IN32(pAC,IoC,Addr,pVal) (void)SkPciReadCfgDWord(pAC,Addr,pVal) |
| 136 | #else /* VPD_DO_IO */ |
| 137 | #define VPD_OUT8(pAC,IoC,Addr,Val) SK_OUT8(IoC,PCI_C(Addr),Val) |
| 138 | #define VPD_OUT16(pAC,IoC,Addr,Val) SK_OUT16(IoC,PCI_C(Addr),Val) |
| 139 | #define VPD_IN8(pAC,IoC,Addr,pVal) SK_IN8(IoC,PCI_C(Addr),pVal) |
| 140 | #define VPD_IN16(pAC,IoC,Addr,pVal) SK_IN16(IoC,PCI_C(Addr),pVal) |
| 141 | #define VPD_IN32(pAC,IoC,Addr,pVal) SK_IN32(IoC,PCI_C(Addr),pVal) |
| 142 | #endif /* VPD_DO_IO */ |
| 143 | #else /* SKDIAG */ |
| 144 | #define VPD_OUT8(pAC,Ioc,Addr,Val) { \ |
| 145 | if ((pAC)->DgT.DgUseCfgCycle) \ |
| 146 | SkPciWriteCfgByte(pAC,Addr,Val); \ |
| 147 | else \ |
| 148 | SK_OUT8(pAC,PCI_C(Addr),Val); \ |
| 149 | } |
| 150 | #define VPD_OUT16(pAC,Ioc,Addr,Val) { \ |
| 151 | if ((pAC)->DgT.DgUseCfgCycle) \ |
| 152 | SkPciWriteCfgWord(pAC,Addr,Val); \ |
| 153 | else \ |
| 154 | SK_OUT16(pAC,PCI_C(Addr),Val); \ |
| 155 | } |
| 156 | #define VPD_IN8(pAC,Ioc,Addr,pVal) { \ |
| 157 | if ((pAC)->DgT.DgUseCfgCycle) \ |
| 158 | SkPciReadCfgByte(pAC,Addr,pVal); \ |
| 159 | else \ |
| 160 | SK_IN8(pAC,PCI_C(Addr),pVal); \ |
| 161 | } |
| 162 | #define VPD_IN16(pAC,Ioc,Addr,pVal) { \ |
| 163 | if ((pAC)->DgT.DgUseCfgCycle) \ |
| 164 | SkPciReadCfgWord(pAC,Addr,pVal); \ |
| 165 | else \ |
| 166 | SK_IN16(pAC,PCI_C(Addr),pVal); \ |
| 167 | } |
| 168 | #define VPD_IN32(pAC,Ioc,Addr,pVal) { \ |
| 169 | if ((pAC)->DgT.DgUseCfgCycle) \ |
| 170 | SkPciReadCfgDWord(pAC,Addr,pVal); \ |
| 171 | else \ |
| 172 | SK_IN32(pAC,PCI_C(Addr),pVal); \ |
| 173 | } |
| 174 | #endif /* nSKDIAG */ |
| 175 | |
| 176 | /* function prototypes ********************************************************/ |
| 177 | |
| 178 | #ifndef SK_KR_PROTO |
| 179 | #ifdef SKDIAG |
| 180 | extern SK_U32 VpdReadDWord( |
| 181 | SK_AC *pAC, |
| 182 | SK_IOC IoC, |
| 183 | int addr); |
| 184 | #endif /* SKDIAG */ |
| 185 | |
| 186 | extern SK_VPD_STATUS *VpdStat( |
| 187 | SK_AC *pAC, |
| 188 | SK_IOC IoC); |
| 189 | |
| 190 | extern int VpdKeys( |
| 191 | SK_AC *pAC, |
| 192 | SK_IOC IoC, |
| 193 | char *buf, |
| 194 | int *len, |
| 195 | int *elements); |
| 196 | |
| 197 | extern int VpdRead( |
| 198 | SK_AC *pAC, |
| 199 | SK_IOC IoC, |
| 200 | const char *key, |
| 201 | char *buf, |
| 202 | int *len); |
| 203 | |
| 204 | extern SK_BOOL VpdMayWrite( |
| 205 | char *key); |
| 206 | |
| 207 | extern int VpdWrite( |
| 208 | SK_AC *pAC, |
| 209 | SK_IOC IoC, |
| 210 | const char *key, |
| 211 | const char *buf); |
| 212 | |
| 213 | extern int VpdDelete( |
| 214 | SK_AC *pAC, |
| 215 | SK_IOC IoC, |
| 216 | char *key); |
| 217 | |
| 218 | extern int VpdUpdate( |
| 219 | SK_AC *pAC, |
| 220 | SK_IOC IoC); |
| 221 | |
| 222 | #ifdef SKDIAG |
| 223 | extern int VpdReadBlock( |
| 224 | SK_AC *pAC, |
| 225 | SK_IOC IoC, |
| 226 | char *buf, |
| 227 | int addr, |
| 228 | int len); |
| 229 | |
| 230 | extern int VpdWriteBlock( |
| 231 | SK_AC *pAC, |
| 232 | SK_IOC IoC, |
| 233 | char *buf, |
| 234 | int addr, |
| 235 | int len); |
| 236 | #endif /* SKDIAG */ |
| 237 | #else /* SK_KR_PROTO */ |
| 238 | extern SK_U32 VpdReadDWord(); |
| 239 | extern SK_VPD_STATUS *VpdStat(); |
| 240 | extern int VpdKeys(); |
| 241 | extern int VpdRead(); |
| 242 | extern SK_BOOL VpdMayWrite(); |
| 243 | extern int VpdWrite(); |
| 244 | extern int VpdDelete(); |
| 245 | extern int VpdUpdate(); |
| 246 | #endif /* SK_KR_PROTO */ |
| 247 | |
| 248 | #endif /* __INC_SKVPD_H_ */ |