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