Maemo patchset 20101501+0m5
[h-e-n] / drivers / dsp / bridge / dynload / doff.h
diff --git a/drivers/dsp/bridge/dynload/doff.h b/drivers/dsp/bridge/dynload/doff.h
new file mode 100644 (file)
index 0000000..2b8fc37
--- /dev/null
@@ -0,0 +1,347 @@
+/*
+ * doff.h
+ *
+ * DSP-BIOS Bridge driver support functions for TI OMAP processors.
+ *
+ * Copyright (C) 2005-2006 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.
+ */
+
+
+/*****************************************************************************/
+/*  DOFF.H - Structures & definitions used for dynamically                   */
+/*           loaded modules file format.  This format is a reformatted       */
+/*           version of COFF.(see coff.h for details)  It optimizes the      */
+/*           layout for the dynamic loader.                                  */
+/*                                                                           */
+/*  .dof files, when viewed as a sequence of 32-bit integers, look the same  */
+/*  on big-endian and little-endian machines.                                */
+/*****************************************************************************/
+#ifndef _DOFF_H
+#define _DOFF_H
+
+#ifndef UINT32_C
+#define UINT32_C(zzz) ((u32)zzz)
+#endif
+
+#define BYTE_RESHUFFLE_VALUE UINT32_C(0x00010203)
+
+/* DOFF file header containing fields categorizing the remainder of the file */
+struct doff_filehdr_t {
+
+       /* string table size, including filename, in bytes   */
+       u32 df_strtab_size;
+
+       /* entry point if one exists */
+       u32 df_entrypt;
+
+       /* identifies byte ordering of file;
+        * always set to BYTE_RESHUFFLE_VALUE  */
+       u32 df_byte_reshuffle;
+
+       /* Size of the string table up to and including the last section name */
+       /* Size includes the name of the COFF file also     */
+       u32 df_scn_name_size;
+
+#ifndef _BIG_ENDIAN
+       /* number of symbols */
+       u16 df_no_syms;
+
+       /* length in bytes of the longest string, including terminating NULL */
+       /* excludes the name of the file     */
+       u16 df_max_str_len;
+
+       /* total number of sections including no-load ones   */
+       u16 df_no_scns;
+
+       /* number of sections containing target code allocated or downloaded */
+       u16 df_target_scns;
+
+       /* unique id for dll file format & version   */
+       u16 df_doff_version;
+
+       /* identifies ISA */
+       u16 df_target_id;
+
+       /* useful file flags */
+       u16 df_flags;
+
+       /* section reference for entry point, N_UNDEF for none,   */
+       /* N_ABS for absolute address */
+       s16 df_entry_secn;
+#else
+       /* length of the longest string, including terminating NULL  */
+       u16 df_max_str_len;
+
+       /* number of symbols */
+       u16 df_no_syms;
+
+       /* number of sections containing target code allocated or downloaded */
+       u16 df_target_scns;
+
+       /* total number of sections including no-load ones */
+       u16 df_no_scns;
+
+       /* identifies ISA */
+       u16 df_target_id;
+
+       /* unique id for dll file format & version */
+       u16 df_doff_version;
+
+       /* section reference for entry point, N_UNDEF for none,  */
+       /* N_ABS for absolute address */
+       s16 df_entry_secn;
+
+       /* useful file flags */
+       u16 df_flags;
+#endif
+       /* checksum for file header record */
+       u32 df_checksum;
+
+} ;
+
+/* flags in the df_flags field */
+#define  DF_LITTLE   0x100
+#define  DF_BIG      0x200
+#define  DF_BYTE_ORDER (DF_LITTLE | DF_BIG)
+
+/* Supported processors */
+#define TMS470_ID   0x97
+#define LEAD_ID     0x98
+#define TMS32060_ID 0x99
+#define LEAD3_ID    0x9c
+
+/* Primary processor for loading */
+#if TMS32060
+#define TARGET_ID   TMS32060_ID
+#endif
+
+/* Verification record containing values used to test integrity of the bits */
+struct doff_verify_rec_t {
+
+       /* time and date stamp */
+       u32 dv_timdat;
+
+       /* checksum for all section records */
+       u32 dv_scn_rec_checksum;
+
+       /* checksum for string table */
+       u32 dv_str_tab_checksum;
+
+       /* checksum for symbol table */
+       u32 dv_sym_tab_checksum;
+
+       /* checksum for verification record */
+       u32 dv_verify_rec_checksum;
+
+} ;
+
+/* String table is an array of null-terminated strings.  The first entry is
+ * the filename, which is added by DLLcreate.  No new structure definitions
+ * are required.
+ */
+
+/* Section Records including information on the corresponding image packets */
+/*
+ *      !!WARNING!!
+ *
+ * This structure is expected to match in form LDR_SECTION_INFO in
+ * dynamic_loader.h
+ */
+
+struct doff_scnhdr_t {
+
+       s32 ds_offset;  /* offset into string table of name    */
+       s32 ds_paddr;   /* RUN address, in target AU           */
+       s32 ds_vaddr;   /* LOAD address, in target AU          */
+       s32 ds_size;    /* section size, in target AU          */
+#ifndef _BIG_ENDIAN
+       u16 ds_page;    /* memory page id                      */
+       u16 ds_flags;   /* section flags                       */
+#else
+       u16 ds_flags;   /* section flags                       */
+       u16 ds_page;    /* memory page id                      */
+#endif
+       u32 ds_first_pkt_offset;
+       /* Absolute byte offset into the file  */
+       /* where the first image record resides */
+
+       s32 ds_nipacks; /* number of image packets             */
+
+};
+
+/* Symbol table entry */
+struct doff_syment_t {
+
+       s32 dn_offset;  /* offset into string table of name    */
+       s32 dn_value;   /* value of symbol                     */
+#ifndef _BIG_ENDIAN
+       s16 dn_scnum;   /* section number                      */
+       s16 dn_sclass;  /* storage class                       */
+#else
+       s16 dn_sclass;  /* storage class                       */
+       s16 dn_scnum;   /* section number, 1-based             */
+#endif
+
+} ;
+
+/* special values for dn_scnum */
+#define  DN_UNDEF  0           /* undefined symbol               */
+#define  DN_ABS    (-1)                /* value of symbol is absolute    */
+/* special values for dn_sclass */
+#define DN_EXT     2
+#define DN_STATLAB 20
+#define DN_EXTLAB  21
+
+/* Default value of image bits in packet */
+/* Configurable by user on the command line */
+#define IMAGE_PACKET_SIZE 1024
+
+/* An image packet contains a chunk of data from a section along with */
+/* information necessary for its processing.                          */
+struct image_packet_t {
+
+       s32 i_num_relocs;       /* number of relocations for   */
+       /* this packet                 */
+
+       s32 i_packet_size;      /* number of bytes in array    */
+       /* "bits" occupied  by         */
+       /* valid data.  Could be       */
+       /* < IMAGE_PACKET_SIZE to      */
+       /* prevent splitting a         */
+       /* relocation across packets.  */
+       /* Last packet of a section    */
+       /* will most likely contain    */
+       /* < IMAGE_PACKET_SIZE bytes   */
+       /* of valid data               */
+
+       s32 i_checksum; /* Checksum for image packet   */
+       /* and the corresponding       */
+       /* relocation records          */
+
+       u8 *i_bits;     /* Actual data in section      */
+
+};
+
+/* The relocation structure definition matches the COFF version.  Offsets  */
+/* however are relative to the image packet base not the section base.     */
+struct reloc_record_t {
+
+       s32 r_vaddr;
+
+       /* expressed in target AUs          */
+
+       union {
+               struct {
+#ifndef _BIG_ENDIAN
+                       u8 _offset;     /* bit offset of rel fld      */
+                       u8 _fieldsz;    /* size of rel fld            */
+                       u8 _wordsz;     /* # bytes containing rel fld */
+                       u8 _dum1;
+                       u16 _dum2;
+                       u16 _type;
+#else
+                       unsigned _dum1:8;
+                       unsigned _wordsz:8;     /* # bytes containing rel fld */
+                       unsigned _fieldsz:8;    /* size of rel fld            */
+                       unsigned _offset:8;     /* bit offset of rel fld      */
+                       u16 _type;
+                       u16 _dum2;
+#endif
+               } _r_field;
+
+               struct {
+                       u32 _spc;       /* image packet relative PC   */
+#ifndef _BIG_ENDIAN
+                       u16 _dum;
+                       u16 _type;      /* relocation type            */
+#else
+                       u16 _type;      /* relocation type            */
+                       u16 _dum;
+#endif
+               } _r_spc;
+
+               struct {
+                       u32 _uval;      /* constant value             */
+#ifndef _BIG_ENDIAN
+                       u16 _dum;
+                       u16 _type;      /* relocation type            */
+#else
+                       u16 _type;      /* relocation type            */
+                       u16 _dum;
+#endif
+               } _r_uval;
+
+               struct {
+                       s32 _symndx;    /* 32-bit sym tbl index       */
+#ifndef _BIG_ENDIAN
+                       u16 _disp;      /* extra addr encode data     */
+                       u16 _type;      /* relocation type            */
+#else
+                       u16 _type;      /* relocation type            */
+                       u16 _disp;      /* extra addr encode data     */
+#endif
+               } _r_sym;
+       } _u_reloc;
+
+} ;
+
+/* abbreviations for convenience */
+#ifndef r_type
+#define r_type      _u_reloc._r_sym._type
+#define r_uval      _u_reloc._r_uval._uval
+#define r_symndx    _u_reloc._r_sym._symndx
+#define r_offset    _u_reloc._r_field._offset
+#define r_fieldsz   _u_reloc._r_field._fieldsz
+#define r_wordsz    _u_reloc._r_field._wordsz
+#define r_disp      _u_reloc._r_sym._disp
+#endif
+
+/*****************************************************************************/
+/*                                                                           */
+/* Important DOFF macros used for file processing                            */
+/*                                                                           */
+/*****************************************************************************/
+
+/* DOFF Versions */
+#define         DOFF0                       0
+
+/* Return the address/size >= to addr that is at a 32-bit boundary           */
+/* This assumes that a byte is 8 bits                                        */
+#define         DOFF_ALIGN(addr)            (((addr) + 3) & ~UINT32_C(3))
+
+/*****************************************************************************/
+/*                                                                           */
+/* The DOFF section header flags field is laid out as follows:               */
+/*                                                                           */
+/*  Bits 0-3 : Section Type                                                  */
+/*  Bit    4 : Set when section requires target memory to be allocated by DL */
+/*  Bit    5 : Set when section requires downloading                         */
+/*  Bits 8-11: Alignment, same as COFF                                       */
+/*                                                                           */
+/*****************************************************************************/
+
+/* Enum for DOFF section types (bits 0-3 of flag): See dynamic_loader.h      */
+
+/* Macros to help processing of sections                                     */
+#define DLOAD_SECT_TYPE(s_hdr)      ((s_hdr)->ds_flags & 0xF)
+
+/* DS_ALLOCATE indicates whether a section needs space on the target         */
+#define DS_ALLOCATE_MASK            0x10
+#define DS_NEEDS_ALLOCATION(s_hdr)  ((s_hdr)->ds_flags & DS_ALLOCATE_MASK)
+
+/* DS_DOWNLOAD indicates that the loader needs to copy bits                  */
+#define DS_DOWNLOAD_MASK            0x20
+#define DS_NEEDS_DOWNLOAD(s_hdr)    ((s_hdr)->ds_flags & DS_DOWNLOAD_MASK)
+
+/* Section alignment requirement in AUs */
+#define DS_ALIGNMENT(ds_flags) (1 << (((ds_flags) >> 8) & 0xF))
+
+#endif                         /* _DOFF_H */