wdenk | b00ec16 | 2003-06-19 23:40:20 +0000 | [diff] [blame] | 1 | /* |
| 2 | * (C) Copyright 2001 |
| 3 | * Murray Jensen, CSIRO-MIT, <Murray.Jensen@csiro.au> |
| 4 | * |
| 5 | * See file CREDITS for list of people who contributed to this |
| 6 | * project. |
| 7 | * |
| 8 | * This program is free software; you can redistribute it and/or |
| 9 | * modify it under the terms of the GNU General Public License as |
| 10 | * published by the Free Software Foundation; either version 2 of |
| 11 | * the License, or (at your option) any later version. |
| 12 | * |
| 13 | * This program is distributed in the hope that it will be useful, |
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 16 | * GNU General Public License for more details. |
| 17 | * |
| 18 | * You should have received a copy of the GNU General Public License |
| 19 | * along with this program; if not, write to the Free Software |
| 20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
| 21 | * MA 02111-1307 USA |
| 22 | */ |
| 23 | |
| 24 | #ifndef _HYMOD_H_ |
| 25 | #define _HYMOD_H_ |
| 26 | |
| 27 | #include <linux/config.h> |
| 28 | #ifdef CONFIG_8260 |
| 29 | #include <asm/iopin_8260.h> |
| 30 | #endif |
| 31 | |
| 32 | /* |
| 33 | * hymod configuration data - passed by boot code via the board information |
| 34 | * structure (only U-Boot has support for this at the moment) |
| 35 | * |
| 36 | * there are three types of data passed up from the boot monitor. the first |
| 37 | * (type hymod_eeprom_t) is the eeprom data that was read off both the main |
| 38 | * (or mother) board and the mezzanine board (if any). this data defines how |
| 39 | * many Xilinx fpgas are on each board, and their types (among other things). |
| 40 | * the second type of data (type xlx_mmap_t, one per Xilinx fpga) defines where |
| 41 | * in the physical address space the various Xilinx fpga access regions have |
| 42 | * been mapped by the boot rom. the third type of data (type xlx_iopins_t, |
| 43 | * one per Xilinx fpga) defines which io port pins are connected to the various |
| 44 | * signals required to program a Xilinx fpga. |
| 45 | * |
| 46 | * A ram/flash "bank" refers to memory controlled by the same chip select. |
| 47 | * |
| 48 | * the eeprom contents are defined as in technical note #2 - basically, |
| 49 | * a header, zero or more records in no particular order, and a 32 bit crc |
| 50 | * a record is 1 or more type bytes, a length byte and "length" bytes. |
| 51 | */ |
| 52 | |
| 53 | #define HYMOD_EEPROM_ID 0xAA /* eeprom id byte */ |
| 54 | #define HYMOD_EEPROM_VER 1 /* eeprom contents version (0-127) */ |
| 55 | #define HYMOD_EEPROM_SIZE 256 /* number of bytes in the eeprom */ |
| 56 | |
| 57 | /* eeprom header */ |
| 58 | typedef |
| 59 | struct { |
| 60 | unsigned char id; /* eeprom id byte */ |
| 61 | unsigned char :1; |
| 62 | unsigned char ver:7; /* eeprom contents version number */ |
| 63 | unsigned long len; /* total # of bytes btw hdr and crc */ |
| 64 | } |
| 65 | hymod_eehdr_t; |
| 66 | |
| 67 | /* maximum number of bytes available for eeprom data records */ |
| 68 | #define HYMOD_EEPROM_MAXLEN (HYMOD_EEPROM_SIZE \ |
| 69 | - sizeof (hymod_eehdr_t) \ |
| 70 | - sizeof (unsigned long)) |
| 71 | |
| 72 | /* eeprom data record */ |
| 73 | typedef |
| 74 | union { |
| 75 | struct { |
| 76 | unsigned char topbit:1; |
| 77 | unsigned char type:7; |
| 78 | unsigned char len; |
| 79 | unsigned char data[1]; /* variable length */ |
| 80 | } small; |
| 81 | struct { |
| 82 | unsigned short topbit:1; |
| 83 | unsigned short nxtbit:1; |
| 84 | unsigned short type:14; |
| 85 | unsigned short len; |
| 86 | unsigned char data[1]; /* variable length */ |
| 87 | } medium; |
| 88 | struct { |
| 89 | unsigned long topbit:1; |
| 90 | unsigned long nxtbit:1; |
| 91 | unsigned long type:30; |
| 92 | unsigned long len; |
| 93 | unsigned char data[1]; /* variable length */ |
| 94 | } large; |
| 95 | } |
| 96 | hymod_eerec_t; |
| 97 | |
| 98 | #define HYMOD_EEOFF_MAIN 0x00 /* i2c addr offset for main eeprom */ |
| 99 | #define HYMOD_EEOFF_MEZZ 0x04 /* i2c addr offset for mezz eepomr */ |
| 100 | |
| 101 | /* eeprom record types */ |
| 102 | #define HYMOD_EEREC_SERNO 1 /* serial number */ |
| 103 | #define HYMOD_EEREC_DATE 2 /* date */ |
| 104 | #define HYMOD_EEREC_BATCH 3 /* batch id */ |
| 105 | #define HYMOD_EEREC_TYPE 4 /* board type */ |
| 106 | #define HYMOD_EEREC_REV 5 /* revision number */ |
| 107 | #define HYMOD_EEREC_SDRAM 6 /* sdram sizes */ |
| 108 | #define HYMOD_EEREC_FLASH 7 /* flash sizes */ |
| 109 | #define HYMOD_EEREC_ZBT 8 /* zbt ram sizes */ |
| 110 | #define HYMOD_EEREC_XLXTYP 9 /* Xilinx fpga types */ |
| 111 | #define HYMOD_EEREC_XLXSPD 10 /* Xilinx fpga speeds */ |
| 112 | #define HYMOD_EEREC_XLXTMP 11 /* Xilinx fpga temperatures */ |
| 113 | #define HYMOD_EEREC_XLXGRD 12 /* Xilinx fpga grades */ |
| 114 | #define HYMOD_EEREC_CPUTYP 13 /* Motorola CPU type */ |
| 115 | #define HYMOD_EEREC_CPUSPD 14 /* CPU speed */ |
| 116 | #define HYMOD_EEREC_BUSSPD 15 /* bus speed */ |
| 117 | #define HYMOD_EEREC_CPMSPD 16 /* CPM speed */ |
| 118 | #define HYMOD_EEREC_HSTYPE 17 /* high-speed serial chip type */ |
| 119 | #define HYMOD_EEREC_HSCHIN 18 /* high-speed serial input channels */ |
| 120 | #define HYMOD_EEREC_HSCHOUT 19 /* high-speed serial output channels */ |
| 121 | |
| 122 | /* some dimensions */ |
| 123 | #define HYMOD_MAX_BATCH 32 /* max no. of bytes in batch id */ |
| 124 | #define HYMOD_MAX_SDRAM 4 /* max sdram "banks" on any board */ |
| 125 | #define HYMOD_MAX_FLASH 4 /* max flash "banks" on any board */ |
| 126 | #define HYMOD_MAX_ZBT 16 /* max ZBT rams on any board */ |
| 127 | #define HYMOD_MAX_XLX 4 /* max Xilinx fpgas on any board */ |
| 128 | |
| 129 | #define HYMOD_MAX_BYTES 16 /* enough to store any bytes array */ |
| 130 | |
| 131 | /* board types */ |
| 132 | #define HYMOD_BDTYPE_NONE 0 /* information not present */ |
| 133 | #define HYMOD_BDTYPE_IO 1 /* I/O main board */ |
| 134 | #define HYMOD_BDTYPE_CLP 2 /* CLP main board */ |
| 135 | #define HYMOD_BDTYPE_DSP 3 /* DSP main board */ |
| 136 | #define HYMOD_BDTYPE_INPUT 4 /* video input mezzanine board */ |
| 137 | #define HYMOD_BDTYPE_ALTINPUT 5 /* video input mezzanine board */ |
| 138 | #define HYMOD_BDTYPE_DISPLAY 6 /* video display mezzanine board */ |
| 139 | #define HYMOD_BDTYPE_MAX 7 /* first invalid value */ |
| 140 | |
| 141 | /* Xilinx fpga types */ |
| 142 | #define HYMOD_XTYP_NONE 0 /* information not present */ |
| 143 | #define HYMOD_XTYP_XCV300E 1 /* Xilinx Virtex 300 */ |
| 144 | #define HYMOD_XTYP_XCV400E 2 /* Xilinx Virtex 400 */ |
| 145 | #define HYMOD_XTYP_XCV600E 3 /* Xilinx Virtex 600 */ |
| 146 | #define HYMOD_XTYP_MAX 4 /* first invalid value */ |
| 147 | |
| 148 | /* Xilinx fpga speeds */ |
| 149 | #define HYMOD_XSPD_NONE 0 /* information not present */ |
| 150 | #define HYMOD_XSPD_SIX 1 |
| 151 | #define HYMOD_XSPD_SEVEN 2 |
| 152 | #define HYMOD_XSPD_EIGHT 3 |
| 153 | #define HYMOD_XSPD_MAX 4 /* first invalid value */ |
| 154 | |
| 155 | /* Xilinx fpga temperatures */ |
| 156 | #define HYMOD_XTMP_NONE 0 /* information not present */ |
| 157 | #define HYMOD_XTMP_COM 1 |
| 158 | #define HYMOD_XTMP_IND 2 |
| 159 | #define HYMOD_XTMP_MAX 3 /* first invalid value */ |
| 160 | |
| 161 | /* Xilinx fpga grades */ |
| 162 | #define HYMOD_XTMP_NONE 0 /* information not present */ |
| 163 | #define HYMOD_XTMP_NORMAL 1 |
| 164 | #define HYMOD_XTMP_ENGSAMP 2 |
| 165 | #define HYMOD_XTMP_MAX 3 /* first invalid value */ |
| 166 | |
| 167 | /* CPU types */ |
| 168 | #define HYMOD_CPUTYPE_NONE 0 /* information not present */ |
| 169 | #define HYMOD_CPUTYPE_MPC8260 1 /* Motorola MPC8260 embedded powerpc */ |
| 170 | #define HYMOD_CPUTYPE_MAX 2 /* first invalid value */ |
| 171 | |
| 172 | /* CPU/BUS/CPM clock speeds */ |
| 173 | #define HYMOD_CLKSPD_NONE 0 /* information not present */ |
| 174 | #define HYMOD_CLKSPD_33MHZ 1 |
| 175 | #define HYMOD_CLKSPD_66MHZ 2 |
| 176 | #define HYMOD_CLKSPD_100MHZ 3 |
| 177 | #define HYMOD_CLKSPD_133MHZ 4 |
| 178 | #define HYMOD_CLKSPD_166MHZ 5 |
| 179 | #define HYMOD_CLKSPD_200MHZ 6 |
| 180 | #define HYMOD_CLKSPD_MAX 7 /* first invalid value */ |
| 181 | |
| 182 | /* high speed serial chip types */ |
| 183 | #define HYMOD_HSSTYPE_NONE 0 /* information not present */ |
| 184 | #define HYMOD_HSSTYPE_AMCC52064 1 |
| 185 | #define HYMOD_HSSTYPE_MAX 2 /* first invalid value */ |
| 186 | |
| 187 | /* a date (yyyy-mm-dd) */ |
| 188 | typedef |
| 189 | struct { |
| 190 | unsigned short year; |
| 191 | unsigned char month; |
| 192 | unsigned char day; |
| 193 | } |
| 194 | hymod_date_t; |
| 195 | |
| 196 | /* describes a Xilinx fpga */ |
| 197 | typedef |
| 198 | struct { |
| 199 | unsigned char type; /* chip type */ |
| 200 | unsigned char speed; /* chip speed rating */ |
| 201 | unsigned char temp; /* chip temperature rating */ |
| 202 | unsigned char grade; /* chip grade */ |
| 203 | } |
| 204 | hymod_xlx_t; |
| 205 | |
| 206 | /* describes a Motorola embedded processor */ |
| 207 | typedef |
| 208 | struct { |
| 209 | unsigned char type; /* CPU type */ |
| 210 | unsigned char cpuspd; /* speed of the PowerPC core */ |
| 211 | unsigned char busspd; /* speed of the system and 60x bus */ |
| 212 | unsigned char cpmspd; /* speed of the CPM co-processor */ |
| 213 | } |
| 214 | hymod_mpc_t; |
| 215 | |
| 216 | /* info about high-speed (1Gbit) serial interface */ |
| 217 | typedef |
| 218 | struct { |
| 219 | unsigned char type; /* high-speed serial chip type */ |
| 220 | unsigned char nchin; /* number of input channels mounted */ |
| 221 | unsigned char nchout; /* number of output channels mounted */ |
| 222 | } |
| 223 | hymod_hss_t; |
| 224 | |
| 225 | /* |
| 226 | * this defines the contents of the serial eeprom that exists on every |
| 227 | * hymod board, including mezzanine boards (the serial eeprom will be |
| 228 | * faked for early development boards that don't have one) |
| 229 | */ |
| 230 | |
| 231 | typedef |
| 232 | struct { |
| 233 | unsigned char valid:1; /* contents of this struct is valid */ |
| 234 | unsigned char ver:7; /* eeprom contents version */ |
| 235 | unsigned char bdtype; /* board type */ |
| 236 | unsigned char bdrev; /* board revision */ |
| 237 | unsigned char batchlen; /* length of batch string below */ |
| 238 | unsigned long serno; /* serial number */ |
| 239 | hymod_date_t date; /* manufacture date */ |
| 240 | unsigned char batch[32]; /* manufacturer specific batch id */ |
| 241 | unsigned char nsdram; /* # of ram "banks" */ |
| 242 | unsigned char nflash; /* # of flash "banks" */ |
| 243 | unsigned char nzbt; /* # of ZBT rams */ |
| 244 | unsigned char nxlx; /* # of Xilinx fpgas */ |
| 245 | unsigned char sdramsz[HYMOD_MAX_SDRAM]; /* log2 of sdram size */ |
| 246 | unsigned char flashsz[HYMOD_MAX_FLASH]; /* log2 of flash size */ |
| 247 | unsigned char zbtsz[HYMOD_MAX_ZBT]; /* log2 of ZBT ram size */ |
| 248 | hymod_xlx_t xlx[HYMOD_MAX_XLX]; /* Xilinx fpga info */ |
| 249 | hymod_mpc_t mpc; /* Motorola MPC CPU info */ |
| 250 | hymod_hss_t hss; /* high-speed serial info */ |
| 251 | } |
| 252 | hymod_eeprom_t; |
| 253 | |
| 254 | /* |
| 255 | * this defines a region in the processor's physical address space |
| 256 | */ |
| 257 | typedef |
| 258 | struct { |
| 259 | unsigned long exists:1; /* 1 if the region exists, 0 if not */ |
| 260 | unsigned long size:31; /* size in bytes */ |
| 261 | unsigned long base; /* base address */ |
| 262 | } |
| 263 | xlx_prgn_t; |
| 264 | |
| 265 | /* |
| 266 | * this defines where the various Xilinx fpga access regions are mapped |
| 267 | * into the physical address space of the processor |
| 268 | */ |
| 269 | typedef |
| 270 | struct { |
| 271 | xlx_prgn_t prog; /* program access region */ |
| 272 | xlx_prgn_t reg; /* register access region */ |
| 273 | xlx_prgn_t port; /* port access region */ |
| 274 | } |
| 275 | xlx_mmap_t; |
| 276 | |
| 277 | /* |
| 278 | * this defines which 8260 i/o port pins are connected to the various |
| 279 | * signals required for programming a Xilinx fpga |
| 280 | */ |
| 281 | typedef |
| 282 | struct { |
| 283 | iopin_t prog_pin; /* assert for >= 300ns to program */ |
| 284 | iopin_t init_pin; /* goes high when fpga is cleared */ |
| 285 | iopin_t done_pin; /* goes high when program is done */ |
| 286 | iopin_t enable_pin; /* some fpgas need enabling */ |
| 287 | } |
| 288 | xlx_iopins_t; |
| 289 | |
| 290 | /* all info about one Xilinx chip */ |
| 291 | typedef |
| 292 | struct { |
| 293 | xlx_mmap_t mmap; |
| 294 | xlx_iopins_t iopins; |
| 295 | unsigned long irq:8; /* h/w intr req number for this fpga */ |
| 296 | } |
| 297 | xlx_info_t; |
| 298 | |
| 299 | /* all info about one hymod board */ |
| 300 | typedef |
| 301 | struct { |
| 302 | hymod_eeprom_t eeprom; |
| 303 | xlx_info_t xlx[HYMOD_MAX_XLX]; |
| 304 | } |
| 305 | hymod_board_t; |
| 306 | |
| 307 | /* |
| 308 | * this defines the configuration information of a hymod board-set |
| 309 | * (main board + possible mezzanine board). In future, there may be |
| 310 | * more than one mezzanine board (stackable?) - if so, add a "mezz2" |
| 311 | * field, and so on... or make mezz an array? |
| 312 | */ |
| 313 | typedef |
| 314 | struct { |
| 315 | unsigned long ver:8; /* version control */ |
| 316 | hymod_board_t main; /* main board info */ |
| 317 | hymod_board_t mezz; /* mezzanine board info */ |
| 318 | unsigned long crc; /* ensures kernel and boot prom agree */ |
| 319 | } |
| 320 | hymod_conf_t; |
| 321 | |
| 322 | #endif /* _HYMOD_H_ */ |