1 /* 2 * params.h 3 * 4 * DSP-BIOS Bridge driver support functions for TI OMAP processors. 5 * 6 * This file defines host and target properties for all machines 7 * supported by the dynamic loader. To be tedious... 8 * 9 * host: the machine on which the dynamic loader runs 10 * target: the machine that the dynamic loader is loading 11 * 12 * Host and target may or may not be the same, depending upon the particular 13 * use. 14 * 15 * Copyright (C) 2005-2006 Texas Instruments, Inc. 16 * 17 * This package is free software; you can redistribute it and/or modify 18 * it under the terms of the GNU General Public License version 2 as 19 * published by the Free Software Foundation. 20 * 21 * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 22 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 23 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 24 */ 25 26 /****************************************************************************** 27 * 28 * Host Properties 29 * 30 **************************************************************************** */ 31 32 #define BITS_PER_BYTE 8 /* bits in the standard PC/SUN byte */ 33 #define LOG_BITS_PER_BYTE 3 /* log base 2 of same */ 34 #define BYTE_MASK ((1U<<BITS_PER_BYTE)-1) 35 36 #if defined(__TMS320C55X__) || defined(_TMS320C5XX) 37 #define BITS_PER_AU 16 38 #define LOG_BITS_PER_AU 4 39 /* use this print string in error messages for uint32_t */ 40 #define FMT_UI32 "0x%lx" 41 #define FMT8_UI32 "%08lx" /* same but no 0x, fixed width field */ 42 #else 43 /* bits in the smallest addressable data storage unit */ 44 #define BITS_PER_AU 8 45 /* log base 2 of the same; useful for shift counts */ 46 #define LOG_BITS_PER_AU 3 47 #define FMT_UI32 "0x%x" 48 #define FMT8_UI32 "%08x" 49 #endif 50 51 /* generic fastest method for swapping bytes and shorts */ 52 #define SWAP32BY16(zz) (((zz) << 16) | ((zz) >> 16)) 53 #define SWAP16BY8(zz) (((zz) << 8) | ((zz) >> 8)) 54 55 /* !! don't be tempted to insert type definitions here; use <stdint.h> !! */ 56 57 /****************************************************************************** 58 * 59 * Target Properties 60 * 61 **************************************************************************** */ 62 63 /*-------------------------------------------------------------------------- */ 64 /* TMS320C6x Target Specific Parameters (byte-addressable) */ 65 /*-------------------------------------------------------------------------- */ 66 #if TMS32060 67 #define MEMORG 0x0L /* Size of configured memory */ 68 #define MEMSIZE 0x0L /* (full address space) */ 69 70 #define CINIT_ALIGN 8 /* alignment of cinit record in TDATA AUs */ 71 #define CINIT_COUNT 4 /* width of count field in TDATA AUs */ 72 #define CINIT_ADDRESS 4 /* width of address field in TDATA AUs */ 73 #define CINIT_PAGE_BITS 0 /* Number of LSBs of address that 74 * are page number */ 75 76 #define LENIENT_SIGNED_RELEXPS 0 /* DOES SIGNED ALLOW MAX UNSIGNED */ 77 78 #undef TARGET_ENDIANNESS /* may be big or little endian */ 79 80 /* align a target address to a word boundary */ 81 #define TARGET_WORD_ALIGN(zz) (((zz) + 0x3) & -0x4) 82 #endif 83 84 /*-------------------------------------------------------------------------- 85 * 86 * DEFAULT SETTINGS and DERIVED PROPERTIES 87 * 88 * This section establishes defaults for values not specified above 89 *-------------------------------------------------------------------------- */ 90 #ifndef TARGET_AU_BITS 91 #define TARGET_AU_BITS 8 /* width of the target addressable unit */ 92 #define LOG_TARGET_AU_BITS 3 /* log2 of same */ 93 #endif 94 95 #ifndef CINIT_DEFAULT_PAGE 96 #define CINIT_DEFAULT_PAGE 0 /* default .cinit page number */ 97 #endif 98 99 #ifndef DATA_RUN2LOAD 100 #define DATA_RUN2LOAD(zz) (zz) /* translate data run address to load address */ 101 #endif 102 103 #ifndef DBG_LIST_PAGE 104 #define DBG_LIST_PAGE 0 /* page number for .dllview section */ 105 #endif 106 107 #ifndef TARGET_WORD_ALIGN 108 /* align a target address to a word boundary */ 109 #define TARGET_WORD_ALIGN(zz) (zz) 110 #endif 111 112 #ifndef TDATA_TO_TADDR 113 #define TDATA_TO_TADDR(zz) (zz) /* target data address to target AU address */ 114 #define TADDR_TO_TDATA(zz) (zz) /* target AU address to target data address */ 115 #define TDATA_AU_BITS TARGET_AU_BITS /* bits per data AU */ 116 #define LOG_TDATA_AU_BITS LOG_TARGET_AU_BITS 117 #endif 118 119 /* 120 * 121 * Useful properties and conversions derived from the above 122 * 123 */ 124 125 /* 126 * Conversions between host and target addresses 127 */ 128 #if LOG_BITS_PER_AU == LOG_TARGET_AU_BITS 129 /* translate target addressable unit to host address */ 130 #define TADDR_TO_HOST(x) (x) 131 /* translate host address to target addressable unit */ 132 #define HOST_TO_TADDR(x) (x) 133 #elif LOG_BITS_PER_AU > LOG_TARGET_AU_BITS 134 #define TADDR_TO_HOST(x) ((x) >> (LOG_BITS_PER_AU-LOG_TARGET_AU_BITS)) 135 #define HOST_TO_TADDR(x) ((x) << (LOG_BITS_PER_AU-LOG_TARGET_AU_BITS)) 136 #else 137 #define TADDR_TO_HOST(x) ((x) << (LOG_TARGET_AU_BITS-LOG_BITS_PER_AU)) 138 #define HOST_TO_TADDR(x) ((x) >> (LOG_TARGET_AU_BITS-LOG_BITS_PER_AU)) 139 #endif 140 141 #if LOG_BITS_PER_AU == LOG_TDATA_AU_BITS 142 /* translate target addressable unit to host address */ 143 #define TDATA_TO_HOST(x) (x) 144 /* translate host address to target addressable unit */ 145 #define HOST_TO_TDATA(x) (x) 146 /* translate host address to target addressable unit, round up */ 147 #define HOST_TO_TDATA_ROUND(x) (x) 148 /* byte offset to host offset, rounded up for TDATA size */ 149 #define BYTE_TO_HOST_TDATA_ROUND(x) BYTE_TO_HOST_ROUND(x) 150 #elif LOG_BITS_PER_AU > LOG_TDATA_AU_BITS 151 #define TDATA_TO_HOST(x) ((x) >> (LOG_BITS_PER_AU-LOG_TDATA_AU_BITS)) 152 #define HOST_TO_TDATA(x) ((x) << (LOG_BITS_PER_AU-LOG_TDATA_AU_BITS)) 153 #define HOST_TO_TDATA_ROUND(x) ((x) << (LOG_BITS_PER_AU-LOG_TDATA_AU_BITS)) 154 #define BYTE_TO_HOST_TDATA_ROUND(x) BYTE_TO_HOST_ROUND(x) 155 #else 156 #define TDATA_TO_HOST(x) ((x) << (LOG_TDATA_AU_BITS-LOG_BITS_PER_AU)) 157 #define HOST_TO_TDATA(x) ((x) >> (LOG_TDATA_AU_BITS-LOG_BITS_PER_AU)) 158 #define HOST_TO_TDATA_ROUND(x) (((x) +\ 159 (1<<(LOG_TDATA_AU_BITS-LOG_BITS_PER_AU))-1) >>\ 160 (LOG_TDATA_AU_BITS-LOG_BITS_PER_AU)) 161 #define BYTE_TO_HOST_TDATA_ROUND(x) (BYTE_TO_HOST((x) +\ 162 (1<<(LOG_TDATA_AU_BITS-LOG_BITS_PER_BYTE))-1) &\ 163 -(TDATA_AU_BITS/BITS_PER_AU)) 164 #endif 165 166 /* 167 * Input in DOFF format is always expresed in bytes, regardless of loading host 168 * so we wind up converting from bytes to target and host units even when the 169 * host is not a byte machine. 170 */ 171 #if LOG_BITS_PER_AU == LOG_BITS_PER_BYTE 172 #define BYTE_TO_HOST(x) (x) 173 #define BYTE_TO_HOST_ROUND(x) (x) 174 #define HOST_TO_BYTE(x) (x) 175 #elif LOG_BITS_PER_AU >= LOG_BITS_PER_BYTE 176 #define BYTE_TO_HOST(x) ((x) >> (LOG_BITS_PER_AU - LOG_BITS_PER_BYTE)) 177 #define BYTE_TO_HOST_ROUND(x) ((x + (BITS_PER_AU/BITS_PER_BYTE-1)) >>\ 178 (LOG_BITS_PER_AU - LOG_BITS_PER_BYTE)) 179 #define HOST_TO_BYTE(x) ((x) << (LOG_BITS_PER_AU - LOG_BITS_PER_BYTE)) 180 #else 181 /* lets not try to deal with sub-8-bit byte machines */ 182 #endif 183 184 #if LOG_TARGET_AU_BITS == LOG_BITS_PER_BYTE 185 /* translate target addressable unit to byte address */ 186 #define TADDR_TO_BYTE(x) (x) 187 /* translate byte address to target addressable unit */ 188 #define BYTE_TO_TADDR(x) (x) 189 #elif LOG_TARGET_AU_BITS > LOG_BITS_PER_BYTE 190 #define TADDR_TO_BYTE(x) ((x) << (LOG_TARGET_AU_BITS-LOG_BITS_PER_BYTE)) 191 #define BYTE_TO_TADDR(x) ((x) >> (LOG_TARGET_AU_BITS-LOG_BITS_PER_BYTE)) 192 #else 193 /* lets not try to deal with sub-8-bit byte machines */ 194 #endif 195 196 #ifdef _BIG_ENDIAN 197 #define HOST_ENDIANNESS 1 198 #else 199 #define HOST_ENDIANNESS 0 200 #endif 201 202 #ifdef TARGET_ENDIANNESS 203 #define TARGET_ENDIANNESS_DIFFERS(rtend) (HOST_ENDIANNESS^TARGET_ENDIANNESS) 204 #elif HOST_ENDIANNESS 205 #define TARGET_ENDIANNESS_DIFFERS(rtend) (!(rtend)) 206 #else 207 #define TARGET_ENDIANNESS_DIFFERS(rtend) (rtend) 208 #endif 209 210 /* the unit in which we process target image data */ 211 #if TARGET_AU_BITS <= 8 212 typedef u8 tgt_au_t; 213 #elif TARGET_AU_BITS <= 16 214 typedef u16 tgt_au_t; 215 #else 216 typedef u32 tgt_au_t; 217 #endif 218 219 /* size of that unit */ 220 #if TARGET_AU_BITS < BITS_PER_AU 221 #define TGTAU_BITS BITS_PER_AU 222 #define LOG_TGTAU_BITS LOG_BITS_PER_AU 223 #else 224 #define TGTAU_BITS TARGET_AU_BITS 225 #define LOG_TGTAU_BITS LOG_TARGET_AU_BITS 226 #endif 227