11541Srgrimes/*******************************************************************************
21541Srgrimes
31541SrgrimesCopyright (c) 2006-2007, Myricom Inc.
41541SrgrimesAll rights reserved.
51541Srgrimes
61541SrgrimesRedistribution and use in source and binary forms, with or without
71541Srgrimesmodification, are permitted provided that the following conditions are met:
81541Srgrimes
91541Srgrimes 1. Redistributions of source code must retain the above copyright notice,
101541Srgrimes    this list of conditions and the following disclaimer.
111541Srgrimes
121541Srgrimes 2. Neither the name of the Myricom Inc, nor the names of its
131541Srgrimes    contributors may be used to endorse or promote products derived from
141541Srgrimes    this software without specific prior written permission.
151541Srgrimes
161541SrgrimesTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
171541SrgrimesAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
181541SrgrimesIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
191541SrgrimesARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
201541SrgrimesLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
211541SrgrimesCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
221541SrgrimesSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
231541SrgrimesINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
241541SrgrimesCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
251541SrgrimesARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
261541SrgrimesPOSSIBILITY OF SUCH DAMAGE.
271541Srgrimes
281541Srgrimes$FreeBSD: releng/10.2/sys/dev/mxge/mcp_gen_header.h 171405 2007-07-12 16:04:55Z gallatin $
2922521Sdyson***************************************************************************/
3050477Speter
311541Srgrimes#ifndef _mcp_gen_header_h
321541Srgrimes#define _mcp_gen_header_h
334464Sbde
344464Sbde/* this file define a standard header used as a first entry point to
352177Spaul   exchange information between firmware/driver and driver.  The
3630779Sbde   header structure can be anywhere in the mcp. It will usually be in
371541Srgrimes   the .data section, because some fields needs to be initialized at
3830779Sbde   compile time.
391541Srgrimes   The 32bit word at offset MX_HEADER_PTR_OFFSET in the mcp must
401541Srgrimes   contains the location of the header.
4183366Sjulian
4228270Swollman   Typically a MCP will start with the following:
431541Srgrimes   .text
4430779Sbde     .space 52    ! to help catch MEMORY_INT errors
4522521Sdyson     bt start     ! jump to real code
461541Srgrimes     nop
4730779Sbde     .long _gen_mcp_header
4830779Sbde
4930779Sbde   The source will have a definition like:
5030779Sbde
5130779Sbde   mcp_gen_header_t gen_mcp_header = {
521541Srgrimes      .header_length = sizeof(mcp_gen_header_t),
53138290Sphk      .mcp_type = MCP_TYPE_XXX,
54138290Sphk      .version = "something $Id: mcp_gen_header.h,v 1.1 2005/12/23 02:10:44 gallatin Exp $",
5530439Sphk      .mcp_globals = (unsigned)&Globals
5692728Salfred   };
57100344Smckusick*/
58100344Smckusick
59222167Srmacklem
60207141Sjeff#define MCP_HEADER_PTR_OFFSET  0x3c
6192728Salfred
6292728Salfred#define MCP_TYPE_MX 0x4d582020 /* "MX  " */
6392728Salfred#define MCP_TYPE_PCIE 0x70636965 /* "PCIE" pcie-only MCP */
64100344Smckusick#define MCP_TYPE_ETH 0x45544820 /* "ETH " */
65100344Smckusick#define MCP_TYPE_MCP0 0x4d435030 /* "MCP0" */
6692728Salfred
6792728Salfred
6892728Salfredtypedef struct mcp_gen_header {
69207141Sjeff  /* the first 4 fields are filled at compile time */
7092728Salfred  unsigned header_length;
7192728Salfred  unsigned mcp_type;
72207141Sjeff  char version[128];
73207141Sjeff  unsigned mcp_globals; /* pointer to mcp-type specific structure */
7498542Smckusick
7592728Salfred  /* filled by the MCP at run-time */
7692728Salfred  unsigned sram_size;
7792728Salfred  unsigned string_specs;  /* either the original STRING_SPECS or a superset */
7892728Salfred  unsigned string_specs_len;
79220985Skib
8092728Salfred  /* Fields above this comment are guaranteed to be present.
8192728Salfred
8292728Salfred     Fields below this comment are extensions added in later versions
83101777Sphk     of this struct, drivers should compare the header_length against
8499101Siedowse     offsetof(field) to check wether a given MCP implements them.
85138290Sphk
861541Srgrimes     Never remove any field.  Keep everything naturally align.
87207141Sjeff  */
88207141Sjeff} mcp_gen_header_t;
89207141Sjeff
9034266Sjulian/* Macro to create a simple mcp header */
9134266Sjulian#define MCP_GEN_HEADER_DECL(type, version_str, global_ptr)	\
9234266Sjulian  struct mcp_gen_header mcp_gen_header = {			\
9392728Salfred    sizeof (struct mcp_gen_header),				\
9498542Smckusick    (type),							\
95207141Sjeff    version_str,						\
96207141Sjeff    (global_ptr),						\
9792728Salfred    SRAM_SIZE,							\
9892728Salfred    (unsigned int) STRING_SPECS,				\
9998542Smckusick    256								\
10092728Salfred  }
10192728Salfred
102207141Sjeff
103207141Sjeff#endif /* _mcp_gen_header_h */
104207141Sjeff