xref: /dflybsd-src/sys/dev/netif/mxge/mcp_gen_header.h (revision 8892ea20f5a790e91e1cf0684073559b613bd916)
1*8892ea20SAggelos Economopoulos /*******************************************************************************
2*8892ea20SAggelos Economopoulos 
3*8892ea20SAggelos Economopoulos Copyright (c) 2006-2007, Myricom Inc.
4*8892ea20SAggelos Economopoulos All rights reserved.
5*8892ea20SAggelos Economopoulos 
6*8892ea20SAggelos Economopoulos Redistribution and use in source and binary forms, with or without
7*8892ea20SAggelos Economopoulos modification, are permitted provided that the following conditions are met:
8*8892ea20SAggelos Economopoulos 
9*8892ea20SAggelos Economopoulos  1. Redistributions of source code must retain the above copyright notice,
10*8892ea20SAggelos Economopoulos     this list of conditions and the following disclaimer.
11*8892ea20SAggelos Economopoulos 
12*8892ea20SAggelos Economopoulos  2. Neither the name of the Myricom Inc, nor the names of its
13*8892ea20SAggelos Economopoulos     contributors may be used to endorse or promote products derived from
14*8892ea20SAggelos Economopoulos     this software without specific prior written permission.
15*8892ea20SAggelos Economopoulos 
16*8892ea20SAggelos Economopoulos THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17*8892ea20SAggelos Economopoulos AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*8892ea20SAggelos Economopoulos IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*8892ea20SAggelos Economopoulos ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20*8892ea20SAggelos Economopoulos LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*8892ea20SAggelos Economopoulos CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*8892ea20SAggelos Economopoulos SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*8892ea20SAggelos Economopoulos INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*8892ea20SAggelos Economopoulos CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*8892ea20SAggelos Economopoulos ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*8892ea20SAggelos Economopoulos POSSIBILITY OF SUCH DAMAGE.
27*8892ea20SAggelos Economopoulos 
28*8892ea20SAggelos Economopoulos $FreeBSD: src/sys/dev/mxge/mcp_gen_header.h,v 1.2 2007/07/12 16:04:55 gallatin Exp $
29*8892ea20SAggelos Economopoulos ***************************************************************************/
30*8892ea20SAggelos Economopoulos 
31*8892ea20SAggelos Economopoulos #ifndef _mcp_gen_header_h
32*8892ea20SAggelos Economopoulos #define _mcp_gen_header_h
33*8892ea20SAggelos Economopoulos 
34*8892ea20SAggelos Economopoulos /* this file define a standard header used as a first entry point to
35*8892ea20SAggelos Economopoulos    exchange information between firmware/driver and driver.  The
36*8892ea20SAggelos Economopoulos    header structure can be anywhere in the mcp. It will usually be in
37*8892ea20SAggelos Economopoulos    the .data section, because some fields needs to be initialized at
38*8892ea20SAggelos Economopoulos    compile time.
39*8892ea20SAggelos Economopoulos    The 32bit word at offset MX_HEADER_PTR_OFFSET in the mcp must
40*8892ea20SAggelos Economopoulos    contains the location of the header.
41*8892ea20SAggelos Economopoulos 
42*8892ea20SAggelos Economopoulos    Typically a MCP will start with the following:
43*8892ea20SAggelos Economopoulos    .text
44*8892ea20SAggelos Economopoulos      .space 52    ! to help catch MEMORY_INT errors
45*8892ea20SAggelos Economopoulos      bt start     ! jump to real code
46*8892ea20SAggelos Economopoulos      nop
47*8892ea20SAggelos Economopoulos      .long _gen_mcp_header
48*8892ea20SAggelos Economopoulos 
49*8892ea20SAggelos Economopoulos    The source will have a definition like:
50*8892ea20SAggelos Economopoulos 
51*8892ea20SAggelos Economopoulos    mcp_gen_header_t gen_mcp_header = {
52*8892ea20SAggelos Economopoulos       .header_length = sizeof(mcp_gen_header_t),
53*8892ea20SAggelos Economopoulos       .mcp_type = MCP_TYPE_XXX,
54*8892ea20SAggelos Economopoulos       .version = "something $Id: mcp_gen_header.h,v 1.1 2005/12/23 02:10:44 gallatin Exp $",
55*8892ea20SAggelos Economopoulos       .mcp_globals = (unsigned)&Globals
56*8892ea20SAggelos Economopoulos    };
57*8892ea20SAggelos Economopoulos */
58*8892ea20SAggelos Economopoulos 
59*8892ea20SAggelos Economopoulos 
60*8892ea20SAggelos Economopoulos #define MCP_HEADER_PTR_OFFSET  0x3c
61*8892ea20SAggelos Economopoulos 
62*8892ea20SAggelos Economopoulos #define MCP_TYPE_MX 0x4d582020 /* "MX  " */
63*8892ea20SAggelos Economopoulos #define MCP_TYPE_PCIE 0x70636965 /* "PCIE" pcie-only MCP */
64*8892ea20SAggelos Economopoulos #define MCP_TYPE_ETH 0x45544820 /* "ETH " */
65*8892ea20SAggelos Economopoulos #define MCP_TYPE_MCP0 0x4d435030 /* "MCP0" */
66*8892ea20SAggelos Economopoulos 
67*8892ea20SAggelos Economopoulos 
68*8892ea20SAggelos Economopoulos typedef struct mcp_gen_header {
69*8892ea20SAggelos Economopoulos   /* the first 4 fields are filled at compile time */
70*8892ea20SAggelos Economopoulos   unsigned header_length;
71*8892ea20SAggelos Economopoulos   unsigned mcp_type;
72*8892ea20SAggelos Economopoulos   char version[128];
73*8892ea20SAggelos Economopoulos   unsigned mcp_globals; /* pointer to mcp-type specific structure */
74*8892ea20SAggelos Economopoulos 
75*8892ea20SAggelos Economopoulos   /* filled by the MCP at run-time */
76*8892ea20SAggelos Economopoulos   unsigned sram_size;
77*8892ea20SAggelos Economopoulos   unsigned string_specs;  /* either the original STRING_SPECS or a superset */
78*8892ea20SAggelos Economopoulos   unsigned string_specs_len;
79*8892ea20SAggelos Economopoulos 
80*8892ea20SAggelos Economopoulos   /* Fields above this comment are guaranteed to be present.
81*8892ea20SAggelos Economopoulos 
82*8892ea20SAggelos Economopoulos      Fields below this comment are extensions added in later versions
83*8892ea20SAggelos Economopoulos      of this struct, drivers should compare the header_length against
84*8892ea20SAggelos Economopoulos      offsetof(field) to check wether a given MCP implements them.
85*8892ea20SAggelos Economopoulos 
86*8892ea20SAggelos Economopoulos      Never remove any field.  Keep everything naturally align.
87*8892ea20SAggelos Economopoulos   */
88*8892ea20SAggelos Economopoulos } mcp_gen_header_t;
89*8892ea20SAggelos Economopoulos 
90*8892ea20SAggelos Economopoulos /* Macro to create a simple mcp header */
91*8892ea20SAggelos Economopoulos #define MCP_GEN_HEADER_DECL(type, version_str, global_ptr)	\
92*8892ea20SAggelos Economopoulos   struct mcp_gen_header mcp_gen_header = {			\
93*8892ea20SAggelos Economopoulos     sizeof (struct mcp_gen_header),				\
94*8892ea20SAggelos Economopoulos     (type),							\
95*8892ea20SAggelos Economopoulos     version_str,						\
96*8892ea20SAggelos Economopoulos     (global_ptr),						\
97*8892ea20SAggelos Economopoulos     SRAM_SIZE,							\
98*8892ea20SAggelos Economopoulos     (unsigned int) STRING_SPECS,				\
99*8892ea20SAggelos Economopoulos     256								\
100*8892ea20SAggelos Economopoulos   }
101*8892ea20SAggelos Economopoulos 
102*8892ea20SAggelos Economopoulos 
103*8892ea20SAggelos Economopoulos #endif /* _mcp_gen_header_h */
104