xref: /dflybsd-src/sys/dev/netif/mxge/mcp_gen_header.h (revision 89d553600f26ced975cd4f2b9614e8dee782200b)
18892ea20SAggelos Economopoulos /*******************************************************************************
28892ea20SAggelos Economopoulos 
38892ea20SAggelos Economopoulos Copyright (c) 2006-2007, Myricom Inc.
48892ea20SAggelos Economopoulos All rights reserved.
58892ea20SAggelos Economopoulos 
68892ea20SAggelos Economopoulos Redistribution and use in source and binary forms, with or without
78892ea20SAggelos Economopoulos modification, are permitted provided that the following conditions are met:
88892ea20SAggelos Economopoulos 
98892ea20SAggelos Economopoulos  1. Redistributions of source code must retain the above copyright notice,
108892ea20SAggelos Economopoulos     this list of conditions and the following disclaimer.
118892ea20SAggelos Economopoulos 
128892ea20SAggelos Economopoulos  2. Neither the name of the Myricom Inc, nor the names of its
138892ea20SAggelos Economopoulos     contributors may be used to endorse or promote products derived from
148892ea20SAggelos Economopoulos     this software without specific prior written permission.
158892ea20SAggelos Economopoulos 
168892ea20SAggelos Economopoulos THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
178892ea20SAggelos Economopoulos AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
188892ea20SAggelos Economopoulos IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
198892ea20SAggelos Economopoulos ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
208892ea20SAggelos Economopoulos LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
218892ea20SAggelos Economopoulos CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
228892ea20SAggelos Economopoulos SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
238892ea20SAggelos Economopoulos INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
248892ea20SAggelos Economopoulos CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
258892ea20SAggelos Economopoulos ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
268892ea20SAggelos Economopoulos POSSIBILITY OF SUCH DAMAGE.
278892ea20SAggelos Economopoulos 
28*89d55360SSepherosa Ziehau $FreeBSD: head/sys/dev/mxge/mcp_gen_header.h 171405 2007-07-12 16:04:55Z gallatin $
298892ea20SAggelos Economopoulos ***************************************************************************/
308892ea20SAggelos Economopoulos 
318892ea20SAggelos Economopoulos #ifndef _mcp_gen_header_h
328892ea20SAggelos Economopoulos #define _mcp_gen_header_h
338892ea20SAggelos Economopoulos 
348892ea20SAggelos Economopoulos /* this file define a standard header used as a first entry point to
358892ea20SAggelos Economopoulos    exchange information between firmware/driver and driver.  The
368892ea20SAggelos Economopoulos    header structure can be anywhere in the mcp. It will usually be in
378892ea20SAggelos Economopoulos    the .data section, because some fields needs to be initialized at
388892ea20SAggelos Economopoulos    compile time.
398892ea20SAggelos Economopoulos    The 32bit word at offset MX_HEADER_PTR_OFFSET in the mcp must
408892ea20SAggelos Economopoulos    contains the location of the header.
418892ea20SAggelos Economopoulos 
428892ea20SAggelos Economopoulos    Typically a MCP will start with the following:
438892ea20SAggelos Economopoulos    .text
448892ea20SAggelos Economopoulos      .space 52    ! to help catch MEMORY_INT errors
458892ea20SAggelos Economopoulos      bt start     ! jump to real code
468892ea20SAggelos Economopoulos      nop
478892ea20SAggelos Economopoulos      .long _gen_mcp_header
488892ea20SAggelos Economopoulos 
498892ea20SAggelos Economopoulos    The source will have a definition like:
508892ea20SAggelos Economopoulos 
518892ea20SAggelos Economopoulos    mcp_gen_header_t gen_mcp_header = {
528892ea20SAggelos Economopoulos       .header_length = sizeof(mcp_gen_header_t),
538892ea20SAggelos Economopoulos       .mcp_type = MCP_TYPE_XXX,
548892ea20SAggelos Economopoulos       .version = "something $Id: mcp_gen_header.h,v 1.1 2005/12/23 02:10:44 gallatin Exp $",
558892ea20SAggelos Economopoulos       .mcp_globals = (unsigned)&Globals
568892ea20SAggelos Economopoulos    };
578892ea20SAggelos Economopoulos */
588892ea20SAggelos Economopoulos 
598892ea20SAggelos Economopoulos 
608892ea20SAggelos Economopoulos #define MCP_HEADER_PTR_OFFSET  0x3c
618892ea20SAggelos Economopoulos 
628892ea20SAggelos Economopoulos #define MCP_TYPE_MX 0x4d582020 /* "MX  " */
638892ea20SAggelos Economopoulos #define MCP_TYPE_PCIE 0x70636965 /* "PCIE" pcie-only MCP */
648892ea20SAggelos Economopoulos #define MCP_TYPE_ETH 0x45544820 /* "ETH " */
658892ea20SAggelos Economopoulos #define MCP_TYPE_MCP0 0x4d435030 /* "MCP0" */
668892ea20SAggelos Economopoulos 
678892ea20SAggelos Economopoulos 
688892ea20SAggelos Economopoulos typedef struct mcp_gen_header {
698892ea20SAggelos Economopoulos   /* the first 4 fields are filled at compile time */
708892ea20SAggelos Economopoulos   unsigned header_length;
718892ea20SAggelos Economopoulos   unsigned mcp_type;
728892ea20SAggelos Economopoulos   char version[128];
738892ea20SAggelos Economopoulos   unsigned mcp_globals; /* pointer to mcp-type specific structure */
748892ea20SAggelos Economopoulos 
758892ea20SAggelos Economopoulos   /* filled by the MCP at run-time */
768892ea20SAggelos Economopoulos   unsigned sram_size;
778892ea20SAggelos Economopoulos   unsigned string_specs;  /* either the original STRING_SPECS or a superset */
788892ea20SAggelos Economopoulos   unsigned string_specs_len;
798892ea20SAggelos Economopoulos 
808892ea20SAggelos Economopoulos   /* Fields above this comment are guaranteed to be present.
818892ea20SAggelos Economopoulos 
828892ea20SAggelos Economopoulos      Fields below this comment are extensions added in later versions
838892ea20SAggelos Economopoulos      of this struct, drivers should compare the header_length against
848892ea20SAggelos Economopoulos      offsetof(field) to check wether a given MCP implements them.
858892ea20SAggelos Economopoulos 
868892ea20SAggelos Economopoulos      Never remove any field.  Keep everything naturally align.
878892ea20SAggelos Economopoulos   */
888892ea20SAggelos Economopoulos } mcp_gen_header_t;
898892ea20SAggelos Economopoulos 
908892ea20SAggelos Economopoulos /* Macro to create a simple mcp header */
918892ea20SAggelos Economopoulos #define MCP_GEN_HEADER_DECL(type, version_str, global_ptr)	\
928892ea20SAggelos Economopoulos   struct mcp_gen_header mcp_gen_header = {			\
938892ea20SAggelos Economopoulos     sizeof (struct mcp_gen_header),				\
948892ea20SAggelos Economopoulos     (type),							\
958892ea20SAggelos Economopoulos     version_str,						\
968892ea20SAggelos Economopoulos     (global_ptr),						\
978892ea20SAggelos Economopoulos     SRAM_SIZE,							\
988892ea20SAggelos Economopoulos     (unsigned int) STRING_SPECS,				\
998892ea20SAggelos Economopoulos     256								\
1008892ea20SAggelos Economopoulos   }
1018892ea20SAggelos Economopoulos 
1028892ea20SAggelos Economopoulos 
1038892ea20SAggelos Economopoulos #endif /* _mcp_gen_header_h */
104