59 lines
1.9 KiB
C
59 lines
1.9 KiB
C
|
#ifndef __MYRI10GE_MCP_GEN_HEADER_H__
|
||
|
#define __MYRI10GE_MCP_GEN_HEADER_H__
|
||
|
|
||
|
/* this file define a standard header used as a first entry point to
|
||
|
* exchange information between firmware/driver and driver. The
|
||
|
* header structure can be anywhere in the mcp. It will usually be in
|
||
|
* the .data section, because some fields needs to be initialized at
|
||
|
* compile time.
|
||
|
* The 32bit word at offset MX_HEADER_PTR_OFFSET in the mcp must
|
||
|
* contains the location of the header.
|
||
|
*
|
||
|
* Typically a MCP will start with the following:
|
||
|
* .text
|
||
|
* .space 52 ! to help catch MEMORY_INT errors
|
||
|
* bt start ! jump to real code
|
||
|
* nop
|
||
|
* .long _gen_mcp_header
|
||
|
*
|
||
|
* The source will have a definition like:
|
||
|
*
|
||
|
* mcp_gen_header_t gen_mcp_header = {
|
||
|
* .header_length = sizeof(mcp_gen_header_t),
|
||
|
* .mcp_type = MCP_TYPE_XXX,
|
||
|
* .version = "something $Id: mcp_gen_header.h,v 1.2 2006/05/13 10:04:35 bgoglin Exp $",
|
||
|
* .mcp_globals = (unsigned)&Globals
|
||
|
* };
|
||
|
*/
|
||
|
|
||
|
#define MCP_HEADER_PTR_OFFSET 0x3c
|
||
|
|
||
|
#define MCP_TYPE_MX 0x4d582020 /* "MX " */
|
||
|
#define MCP_TYPE_PCIE 0x70636965 /* "PCIE" pcie-only MCP */
|
||
|
#define MCP_TYPE_ETH 0x45544820 /* "ETH " */
|
||
|
#define MCP_TYPE_MCP0 0x4d435030 /* "MCP0" */
|
||
|
|
||
|
struct mcp_gen_header {
|
||
|
/* the first 4 fields are filled at compile time */
|
||
|
unsigned header_length;
|
||
|
unsigned mcp_type;
|
||
|
char version[128];
|
||
|
unsigned mcp_globals; /* pointer to mcp-type specific structure */
|
||
|
|
||
|
/* filled by the MCP at run-time */
|
||
|
unsigned sram_size;
|
||
|
unsigned string_specs; /* either the original STRING_SPECS or a superset */
|
||
|
unsigned string_specs_len;
|
||
|
|
||
|
/* Fields above this comment are guaranteed to be present.
|
||
|
*
|
||
|
* Fields below this comment are extensions added in later versions
|
||
|
* of this struct, drivers should compare the header_length against
|
||
|
* offsetof(field) to check wether a given MCP implements them.
|
||
|
*
|
||
|
* Never remove any field. Keep everything naturally align.
|
||
|
*/
|
||
|
};
|
||
|
|
||
|
#endif /* __MYRI10GE_MCP_GEN_HEADER_H__ */
|