| /* |
| * params.h |
| * |
| * DSP-BIOS Bridge driver support functions for TI OMAP processors. |
| * |
| * This file defines host and target properties for all machines |
| * supported by the dynamic loader. To be tedious... |
| * |
| * host: the machine on which the dynamic loader runs |
| * target: the machine that the dynamic loader is loading |
| * |
| * Host and target may or may not be the same, depending upon the particular |
| * use. |
| * |
| * 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. |
| */ |
| |
| /****************************************************************************** |
| * |
| * Host Properties |
| * |
| **************************************************************************** */ |
| |
| #define BITS_PER_BYTE 8 /* bits in the standard PC/SUN byte */ |
| #define LOG_BITS_PER_BYTE 3 /* log base 2 of same */ |
| #define BYTE_MASK ((1U<<BITS_PER_BYTE)-1) |
| |
| #if defined(__TMS320C55X__) || defined(_TMS320C5XX) |
| #define BITS_PER_AU 16 |
| #define LOG_BITS_PER_AU 4 |
| /* use this print string in error messages for uint32_t */ |
| #define FMT_UI32 "0x%lx" |
| #define FMT8_UI32 "%08lx" /* same but no 0x, fixed width field */ |
| #else |
| /* bits in the smallest addressable data storage unit */ |
| #define BITS_PER_AU 8 |
| /* log base 2 of the same; useful for shift counts */ |
| #define LOG_BITS_PER_AU 3 |
| #define FMT_UI32 "0x%x" |
| #define FMT8_UI32 "%08x" |
| #endif |
| |
| /* generic fastest method for swapping bytes and shorts */ |
| #define SWAP32BY16(zz) (((zz) << 16) | ((zz) >> 16)) |
| #define SWAP16BY8(zz) (((zz) << 8) | ((zz) >> 8)) |
| |
| /* !! don't be tempted to insert type definitions here; use <stdint.h> !! */ |
| |
| /****************************************************************************** |
| * |
| * Target Properties |
| * |
| **************************************************************************** */ |
| |
| /*-------------------------------------------------------------------------- */ |
| /* TMS320C6x Target Specific Parameters (byte-addressable) */ |
| /*-------------------------------------------------------------------------- */ |
| #if TMS32060 |
| #define MEMORG 0x0L /* Size of configured memory */ |
| #define MEMSIZE 0x0L /* (full address space) */ |
| |
| #define CINIT_ALIGN 8 /* alignment of cinit record in TDATA AUs */ |
| #define CINIT_COUNT 4 /* width of count field in TDATA AUs */ |
| #define CINIT_ADDRESS 4 /* width of address field in TDATA AUs */ |
| #define CINIT_PAGE_BITS 0 /* Number of LSBs of address that |
| * are page number */ |
| |
| #define LENIENT_SIGNED_RELEXPS 0 /* DOES SIGNED ALLOW MAX UNSIGNED */ |
| |
| #undef TARGET_ENDIANNESS /* may be big or little endian */ |
| |
| /* align a target address to a word boundary */ |
| #define TARGET_WORD_ALIGN(zz) (((zz) + 0x3) & -0x4) |
| #endif |
| |
| /*-------------------------------------------------------------------------- |
| * |
| * DEFAULT SETTINGS and DERIVED PROPERTIES |
| * |
| * This section establishes defaults for values not specified above |
| *-------------------------------------------------------------------------- */ |
| #ifndef TARGET_AU_BITS |
| #define TARGET_AU_BITS 8 /* width of the target addressable unit */ |
| #define LOG_TARGET_AU_BITS 3 /* log2 of same */ |
| #endif |
| |
| #ifndef CINIT_DEFAULT_PAGE |
| #define CINIT_DEFAULT_PAGE 0 /* default .cinit page number */ |
| #endif |
| |
| #ifndef DATA_RUN2LOAD |
| #define DATA_RUN2LOAD(zz) (zz) /* translate data run address to load address */ |
| #endif |
| |
| #ifndef DBG_LIST_PAGE |
| #define DBG_LIST_PAGE 0 /* page number for .dllview section */ |
| #endif |
| |
| #ifndef TARGET_WORD_ALIGN |
| /* align a target address to a word boundary */ |
| #define TARGET_WORD_ALIGN(zz) (zz) |
| #endif |
| |
| #ifndef TDATA_TO_TADDR |
| #define TDATA_TO_TADDR(zz) (zz) /* target data address to target AU address */ |
| #define TADDR_TO_TDATA(zz) (zz) /* target AU address to target data address */ |
| #define TDATA_AU_BITS TARGET_AU_BITS /* bits per data AU */ |
| #define LOG_TDATA_AU_BITS LOG_TARGET_AU_BITS |
| #endif |
| |
| /* |
| * |
| * Useful properties and conversions derived from the above |
| * |
| */ |
| |
| /* |
| * Conversions between host and target addresses |
| */ |
| #if LOG_BITS_PER_AU == LOG_TARGET_AU_BITS |
| /* translate target addressable unit to host address */ |
| #define TADDR_TO_HOST(x) (x) |
| /* translate host address to target addressable unit */ |
| #define HOST_TO_TADDR(x) (x) |
| #elif LOG_BITS_PER_AU > LOG_TARGET_AU_BITS |
| #define TADDR_TO_HOST(x) ((x) >> (LOG_BITS_PER_AU-LOG_TARGET_AU_BITS)) |
| #define HOST_TO_TADDR(x) ((x) << (LOG_BITS_PER_AU-LOG_TARGET_AU_BITS)) |
| #else |
| #define TADDR_TO_HOST(x) ((x) << (LOG_TARGET_AU_BITS-LOG_BITS_PER_AU)) |
| #define HOST_TO_TADDR(x) ((x) >> (LOG_TARGET_AU_BITS-LOG_BITS_PER_AU)) |
| #endif |
| |
| #if LOG_BITS_PER_AU == LOG_TDATA_AU_BITS |
| /* translate target addressable unit to host address */ |
| #define TDATA_TO_HOST(x) (x) |
| /* translate host address to target addressable unit */ |
| #define HOST_TO_TDATA(x) (x) |
| /* translate host address to target addressable unit, round up */ |
| #define HOST_TO_TDATA_ROUND(x) (x) |
| /* byte offset to host offset, rounded up for TDATA size */ |
| #define BYTE_TO_HOST_TDATA_ROUND(x) BYTE_TO_HOST_ROUND(x) |
| #elif LOG_BITS_PER_AU > LOG_TDATA_AU_BITS |
| #define TDATA_TO_HOST(x) ((x) >> (LOG_BITS_PER_AU-LOG_TDATA_AU_BITS)) |
| #define HOST_TO_TDATA(x) ((x) << (LOG_BITS_PER_AU-LOG_TDATA_AU_BITS)) |
| #define HOST_TO_TDATA_ROUND(x) ((x) << (LOG_BITS_PER_AU-LOG_TDATA_AU_BITS)) |
| #define BYTE_TO_HOST_TDATA_ROUND(x) BYTE_TO_HOST_ROUND(x) |
| #else |
| #define TDATA_TO_HOST(x) ((x) << (LOG_TDATA_AU_BITS-LOG_BITS_PER_AU)) |
| #define HOST_TO_TDATA(x) ((x) >> (LOG_TDATA_AU_BITS-LOG_BITS_PER_AU)) |
| #define HOST_TO_TDATA_ROUND(x) (((x) +\ |
| (1<<(LOG_TDATA_AU_BITS-LOG_BITS_PER_AU))-1) >>\ |
| (LOG_TDATA_AU_BITS-LOG_BITS_PER_AU)) |
| #define BYTE_TO_HOST_TDATA_ROUND(x) (BYTE_TO_HOST((x) +\ |
| (1<<(LOG_TDATA_AU_BITS-LOG_BITS_PER_BYTE))-1) &\ |
| -(TDATA_AU_BITS/BITS_PER_AU)) |
| #endif |
| |
| /* |
| * Input in DOFF format is always expresed in bytes, regardless of loading host |
| * so we wind up converting from bytes to target and host units even when the |
| * host is not a byte machine. |
| */ |
| #if LOG_BITS_PER_AU == LOG_BITS_PER_BYTE |
| #define BYTE_TO_HOST(x) (x) |
| #define BYTE_TO_HOST_ROUND(x) (x) |
| #define HOST_TO_BYTE(x) (x) |
| #elif LOG_BITS_PER_AU >= LOG_BITS_PER_BYTE |
| #define BYTE_TO_HOST(x) ((x) >> (LOG_BITS_PER_AU - LOG_BITS_PER_BYTE)) |
| #define BYTE_TO_HOST_ROUND(x) ((x + (BITS_PER_AU/BITS_PER_BYTE-1)) >>\ |
| (LOG_BITS_PER_AU - LOG_BITS_PER_BYTE)) |
| #define HOST_TO_BYTE(x) ((x) << (LOG_BITS_PER_AU - LOG_BITS_PER_BYTE)) |
| #else |
| /* lets not try to deal with sub-8-bit byte machines */ |
| #endif |
| |
| #if LOG_TARGET_AU_BITS == LOG_BITS_PER_BYTE |
| /* translate target addressable unit to byte address */ |
| #define TADDR_TO_BYTE(x) (x) |
| /* translate byte address to target addressable unit */ |
| #define BYTE_TO_TADDR(x) (x) |
| #elif LOG_TARGET_AU_BITS > LOG_BITS_PER_BYTE |
| #define TADDR_TO_BYTE(x) ((x) << (LOG_TARGET_AU_BITS-LOG_BITS_PER_BYTE)) |
| #define BYTE_TO_TADDR(x) ((x) >> (LOG_TARGET_AU_BITS-LOG_BITS_PER_BYTE)) |
| #else |
| /* lets not try to deal with sub-8-bit byte machines */ |
| #endif |
| |
| #ifdef _BIG_ENDIAN |
| #define HOST_ENDIANNESS 1 |
| #else |
| #define HOST_ENDIANNESS 0 |
| #endif |
| |
| #ifdef TARGET_ENDIANNESS |
| #define TARGET_ENDIANNESS_DIFFERS(rtend) (HOST_ENDIANNESS^TARGET_ENDIANNESS) |
| #elif HOST_ENDIANNESS |
| #define TARGET_ENDIANNESS_DIFFERS(rtend) (!(rtend)) |
| #else |
| #define TARGET_ENDIANNESS_DIFFERS(rtend) (rtend) |
| #endif |
| |
| /* the unit in which we process target image data */ |
| #if TARGET_AU_BITS <= 8 |
| typedef u8 tgt_au_t; |
| #elif TARGET_AU_BITS <= 16 |
| typedef u16 tgt_au_t; |
| #else |
| typedef u32 tgt_au_t; |
| #endif |
| |
| /* size of that unit */ |
| #if TARGET_AU_BITS < BITS_PER_AU |
| #define TGTAU_BITS BITS_PER_AU |
| #define LOG_TGTAU_BITS LOG_BITS_PER_AU |
| #else |
| #define TGTAU_BITS TARGET_AU_BITS |
| #define LOG_TGTAU_BITS LOG_TARGET_AU_BITS |
| #endif |