diff options
Diffstat (limited to 'drivers/staging/tidspbridge/dynload/module_list.h')
-rw-r--r-- | drivers/staging/tidspbridge/dynload/module_list.h | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/drivers/staging/tidspbridge/dynload/module_list.h b/drivers/staging/tidspbridge/dynload/module_list.h new file mode 100644 index 000000000000..a216bb131a40 --- /dev/null +++ b/drivers/staging/tidspbridge/dynload/module_list.h @@ -0,0 +1,159 @@ +/* + * dspbridge/mpu_driver/src/dynload/module_list.h + * + * DSP-BIOS Bridge driver support functions for TI OMAP processors. + * + * Copyright (C) 2008 Texas Instruments, Inc. + * + * This package is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* + * This C header file gives the layout of the data structure created by the + * dynamic loader to describe the set of modules loaded into the DSP. + * + * Linked List Structure: + * ---------------------- + * The data structure defined here is a singly-linked list. The list + * represents the set of modules which are currently loaded in the DSP memory. + * The first entry in the list is a header record which contains a flag + * representing the state of the list. The rest of the entries in the list + * are module records. + * + * Global symbol _DLModules designates the first record in the list (i.e. the + * header record). This symbol must be defined in any program that wishes to + * use DLLview plug-in. + * + * String Representation: + * ---------------------- + * The string names of the module and its sections are stored in a block of + * memory which follows the module record itself. The strings are ordered: + * module name first, followed by section names in order from the first + * section to the last. String names are tightly packed arrays of 8-bit + * characters (two characters per 16-bit word on the C55x). Strings are + * zero-byte-terminated. + * + * Creating and updating the list: + * ------------------------------- + * Upon loading a new module into the DSP memory the dynamic loader inserts a + * new module record as the first module record in the list. The fields of + * this module record are initialized to reflect the properties of the module. + * The dynamic loader does NOT increment the flag/counter in the list's header + * record. + * + * Upon unloading a module from the DSP memory the dynamic loader removes the + * module's record from this list. The dynamic loader also increments the + * flag/counter in the list's header record to indicate that the list has been + * changed. + */ + +#ifndef _MODULE_LIST_H_ +#define _MODULE_LIST_H_ + +#include <linux/types.h> + +/* Global pointer to the modules_header structure */ +#define MODULES_HEADER "_DLModules" +#define MODULES_HEADER_NO_UNDERSCORE "DLModules" + +/* Initial version number */ +#define INIT_VERSION 1 + +/* Verification number -- to be recorded in each module record */ +#define VERIFICATION 0x79 + +/* forward declarations */ +struct dll_module; +struct dll_sect; + +/* the first entry in the list is the modules_header record; + * its address is contained in the global _DLModules pointer */ +struct modules_header { + + /* + * Address of the first dll_module record in the list or NULL. + * Note: for C55x this is a word address (C55x data is + * word-addressable) + */ + u32 first_module; + + /* Combined storage size (in target addressable units) of the + * dll_module record which follows this header record, or zero + * if the list is empty. This size includes the module's string table. + * Note: for C55x the unit is a 16-bit word */ + u16 first_module_size; + + /* Counter is incremented whenever a module record is removed from + * the list */ + u16 update_flag; + +}; + +/* for each 32-bits in above structure, a bitmap, LSB first, whose bits are: + * 0 => a 32-bit value, 1 => 2 16-bit values */ +/* swapping bitmap for type modules_header */ +#define MODULES_HEADER_BITMAP 0x2 + +/* information recorded about each section in a module */ +struct dll_sect { + + /* Load-time address of the section. + * Note: for C55x this is a byte address for program sections, and + * a word address for data sections. C55x program memory is + * byte-addressable, while data memory is word-addressable. */ + u32 sect_load_adr; + + /* Run-time address of the section. + * Note 1: for C55x this is a byte address for program sections, and + * a word address for data sections. + * Note 2: for C55x two most significant bits of this field indicate + * the section type: '00' for a code section, '11' for a data section + * (C55 addresses are really only 24-bits wide). */ + u32 sect_run_adr; + +}; + +/* the rest of the entries in the list are module records */ +struct dll_module { + + /* Address of the next dll_module record in the list, or 0 if this is + * the last record in the list. + * Note: for C55x this is a word address (C55x data is + * word-addressable) */ + u32 next_module; + + /* Combined storage size (in target addressable units) of the + * dll_module record which follows this one, or zero if this is the + * last record in the list. This size includes the module's string + * table. + * Note: for C55x the unit is a 16-bit word. */ + u16 next_module_size; + + /* version number of the tooling; set to INIT_VERSION for Phase 1 */ + u16 version; + + /* the verification word; set to VERIFICATION */ + u16 verification; + + /* Number of sections in the sects array */ + u16 num_sects; + + /* Module's "unique" id; copy of the timestamp from the host + * COFF file */ + u32 timestamp; + + /* Array of num_sects elements of the module's section records */ + struct dll_sect sects[1]; +}; + +/* for each 32 bits in above structure, a bitmap, LSB first, whose bits are: + * 0 => a 32-bit value, 1 => 2 16-bit values */ +#define DLL_MODULE_BITMAP 0x6 /* swapping bitmap for type dll_module */ + +#endif /* _MODULE_LIST_H_ */ |