/*
 * asm/metag_regs.h
 *
 * Copyright (C) 2000-2007, 2012 Imagination Technologies.
 *
 * This program 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.
 *
 * Various defines for Meta core (non memory-mapped) registers.
 */

#ifndef _ASM_METAG_REGS_H_
#define _ASM_METAG_REGS_H_

/*
 * CHIP Unit Identifiers and Valid/Global register number masks
 * ------------------------------------------------------------
 */
#define TXUCT_ID    0x0     /* Control unit regs */
#ifdef METAC_1_2
#define     TXUCT_MASK  0xFF0FFFFF  /* Valid regs 0..31  */
#else
#define     TXUCT_MASK  0xFF1FFFFF  /* Valid regs 0..31  */
#endif
#define     TGUCT_MASK  0x00000000  /* No global regs    */
#define TXUD0_ID    0x1     /* Data unit regs */
#define TXUD1_ID    0x2
#define     TXUDX_MASK  0xFFFFFFFF  /* Valid regs 0..31 */
#define     TGUDX_MASK  0xFFFF0000  /* Global regs for base inst */
#define     TXUDXDSP_MASK   0x0F0FFFFF  /* Valid DSP regs */
#define     TGUDXDSP_MASK   0x0E0E0000  /* Global DSP ACC regs */
#define TXUA0_ID    0x3     /* Address unit regs */
#define TXUA1_ID    0x4
#define     TXUAX_MASK  0x0000FFFF  /* Valid regs   0-15 */
#define     TGUAX_MASK  0x0000FF00  /* Global regs  8-15 */
#define TXUPC_ID    0x5     /* PC registers */
#define     TXUPC_MASK  0x00000003  /* Valid regs   0- 1 */
#define     TGUPC_MASK  0x00000000  /* No global regs    */
#define TXUPORT_ID  0x6     /* Ports are not registers */
#define TXUTR_ID    0x7
#define     TXUTR_MASK  0x0000005F  /* Valid regs   0-3,4,6 */
#define     TGUTR_MASK  0x00000000  /* No global regs    */
#ifdef METAC_2_1
#define TXUTT_ID    0x8
#define     TXUTT_MASK  0x0000000F  /* Valid regs   0-3 */
#define     TGUTT_MASK  0x00000010  /* Global reg   4   */
#define TXUFP_ID    0x9     /* FPU regs */
#define     TXUFP_MASK  0x0000FFFF  /* Valid regs   0-15 */
#define     TGUFP_MASK  0x00000000  /* No global regs    */
#endif /* METAC_2_1 */

#ifdef METAC_1_2
#define TXUXX_MASKS { TXUCT_MASK, TXUDX_MASK, TXUDX_MASK, TXUAX_MASK, \
		      TXUAX_MASK, TXUPC_MASK,          0, TXUTR_MASK, \
		      0, 0, 0, 0, 0, 0, 0, 0                          }
#define TGUXX_MASKS { TGUCT_MASK, TGUDX_MASK, TGUDX_MASK, TGUAX_MASK, \
		      TGUAX_MASK, TGUPC_MASK,          0, TGUTR_MASK, \
		      0, 0, 0, 0, 0, 0, 0, 0                          }
#else /* METAC_1_2 */
#define TXUXX_MASKS { TXUCT_MASK, TXUDX_MASK, TXUDX_MASK, TXUAX_MASK, \
		      TXUAX_MASK, TXUPC_MASK,          0, TXUTR_MASK, \
		      TXUTT_MASK, TXUFP_MASK,          0,          0, \
			       0,          0,          0,          0  }
#define TGUXX_MASKS { TGUCT_MASK, TGUDX_MASK, TGUDX_MASK, TGUAX_MASK, \
		      TGUAX_MASK, TGUPC_MASK,          0, TGUTR_MASK, \
		      TGUTT_MASK, TGUFP_MASK,          0,          0, \
			       0,          0,          0,          0  }
#endif /* !METAC_1_2 */

#define TXUXXDSP_MASKS { 0, TXUDXDSP_MASK, TXUDXDSP_MASK, 0, 0, 0, 0, 0, \
			 0, 0, 0, 0, 0, 0, 0, 0                          }
#define TGUXXDSP_MASKS { 0, TGUDXDSP_MASK, TGUDXDSP_MASK, 0, 0, 0, 0, 0, \
			 0, 0, 0, 0, 0, 0, 0, 0                          }

/* -------------------------------------------------------------------------
;                          DATA AND ADDRESS UNIT REGISTERS
;  -----------------------------------------------------------------------*/
/*
  Thread local D0 registers
 */
/*   D0.0    ; Holds 32-bit result, can be used as scratch */
#define D0Re0 D0.0
/*   D0.1    ; Used to pass Arg6_32 */
#define D0Ar6 D0.1
/*   D0.2    ; Used to pass Arg4_32 */
#define D0Ar4 D0.2
/*   D0.3    ; Used to pass Arg2_32 to a called routine (see D1.3 below) */
#define D0Ar2 D0.3
/*   D0.4    ; Can be used as scratch; used to save A0FrP in entry sequences */
#define D0FrT D0.4
/*   D0.5    ; C compiler assumes preservation, save with D1.5 if used */
/*   D0.6    ; C compiler assumes preservation, save with D1.6 if used */
/*   D0.7    ; C compiler assumes preservation, save with D1.7 if used */
/*   D0.8    ; Use of D0.8 and above is not encouraged */
/*   D0.9  */
/*   D0.10 */
/*   D0.11 */
/*   D0.12 */
/*   D0.13 */
/*   D0.14 */
/*   D0.15 */
/*
   Thread local D1 registers
 */
/*   D1.0    ; Holds top 32-bits of 64-bit result, can be used as scratch */
#define D1Re0 D1.0
/*   D1.1    ; Used to pass Arg5_32 */
#define D1Ar5 D1.1
/*   D1.2    ; Used to pass Arg3_32 */
#define D1Ar3 D1.2
/*   D1.3    ; Used to pass Arg1_32 (first 32-bit argument) to a called routine */
#define D1Ar1 D1.3
/*   D1.4    ; Used for Return Pointer, save during entry with A0FrP (via D0.4) */
#define D1RtP D1.4
/*   D1.5    ; C compiler assumes preservation, save if used */
/*   D1.6    ; C compiler assumes preservation, save if used */
/*   D1.7    ; C compiler assumes preservation, save if used */
/*   D1.8    ; Use of D1.8 and above is not encouraged */
/*   D1.9  */
/*   D1.10 */
/*   D1.11 */
/*   D1.12 */
/*   D1.13 */
/*   D1.14 */
/*   D1.15 */
/*
   Thread local A0 registers
 */
/*   A0.0    ; Primary stack pointer */
#define A0StP A0.0
/*   A0.1    ; Used as local frame pointer in C, save if used (via D0.4) */
#define A0FrP A0.1
/*   A0.2  */
/*   A0.3  */
/*   A0.4    ; Use of A0.4 and above is not encouraged */
/*   A0.5  */
/*   A0.6  */
/*   A0.7  */
/*
   Thread local A1 registers
 */
/*   A1.0    ; Global static chain pointer - do not modify */
#define A1GbP A1.0
/*   A1.1    ; Local static chain pointer in C, can be used as scratch */
#define A1LbP A1.1
/*   A1.2  */
/*   A1.3  */
/*   A1.4    ; Use of A1.4 and above is not encouraged */
/*   A1.5  */
/*   A1.6  */
/*   A1.7  */
#ifdef METAC_2_1
/* Renameable registers for use with Fast Interrupts */
/* The interrupt stack pointer (usually a global register) */
#define A0IStP A0IReg
/* The interrupt global pointer (usually a global register) */
#define A1IGbP A1IReg
#endif
/*
   Further registers may be globally allocated via linkage/loading tools,
   normally they are not used.
 */
/*-------------------------------------------------------------------------
;                    STACK STRUCTURE and CALLING CONVENTION
; -----------------------------------------------------------------------*/
/*
; Calling convention indicates that the following is the state of the
; stack frame at the start of a routine-
;
;       Arg9_32 [A0StP+#-12]
;       Arg8_32 [A0StP+#- 8]
;       Arg7_32 [A0StP+#- 4]
;   A0StP->
;
; Registers D1.3, D0.3, ..., to D0.1 are used to pass Arg1_32 to Arg6_32
;   respectively. If a routine needs to store them on the stack in order
;   to make sub-calls or because of the general complexity of the routine it
;   is best to dump these registers immediately at the start of a routine
;   using a MSETL or SETL instruction-
;
;   MSETL   [A0StP],D0Ar6,D0Ar4,D0Ar2; Only dump argments expected
;or SETL    [A0StP+#8++],D0Ar2       ; Up to two 32-bit args expected
;
; For non-leaf routines it is always necessary to save and restore at least
; the return address value D1RtP on the stack. Also by convention if the
; frame is saved then a new A0FrP value must be set-up. So for non-leaf
; routines at this point both these registers must be saved onto the stack
; using a SETL instruction and the new A0FrP value is then set-up-
;
;   MOV     D0FrT,A0FrP
;   ADD     A0FrP,A0StP,#0
;   SETL    [A0StP+#8++],D0FrT,D1RtP
;
; Registers D0.5, D1.5, to D1.7 are assumed to be preserved across calls so
;   a SETL or MSETL instruction can be used to save the current state
;   of these registers if they are modified by the current routine-
;
;   MSETL   [A0StP],D0.5,D0.6,D0.7   ; Only save registers modified
;or SETL    [A0StP+#8++],D0.5        ; Only D0.5 and/or D1.5 modified
;
; All of the above sequences can be combined into one maximal case-
;
;   MOV     D0FrT,A0FrP              ; Save and calculate new frame pointer
;   ADD     A0FrP,A0StP,#(ARS)
;   MSETL   [A0StP],D0Ar6,D0Ar4,D0Ar2,D0FrT,D0.5,D0.6,D0.7
;
; Having completed the above sequence the only remaining task on routine
; entry is to reserve any local and outgoing argment storage space on the
; stack. This instruction may be omitted if the size of this region is zero-
;
;   ADD     A0StP,A0StP,#(LCS)
;
; LCS is the first example use of one of a number of standard local defined
; values that can be created to make assembler code more readable and
; potentially more robust-
;
; #define ARS   0x18                 ; Register arg bytes saved on stack
; #define FRS   0x20                 ; Frame save area size in bytes
; #define LCS   0x00                 ; Locals and Outgoing arg size
; #define ARO   (LCS+FRS)            ; Stack offset to access args
;
; All of the above defines should be undefined (#undef) at the end of each
; routine to avoid accidental use in the next routine.
;
; Given all of the above the following stack structure is expected during
; the body of a routine if all args passed in registers are saved during
; entry-
;
;                                    ; 'Incoming args area'
;         Arg10_32 [A0StP+#-((10*4)+ARO)]       Arg9_32  [A0StP+#-(( 9*4)+ARO)]
;         Arg8_32  [A0StP+#-(( 8*4)+ARO)]       Arg7_32  [A0StP+#-(( 7*4)+ARO)]
;--- Call point
; D0Ar6=  Arg6_32  [A0StP+#-(( 6*4)+ARO)] D1Ar5=Arg5_32  [A0StP+#-(( 5*4)+ARO)]
; D0Ar4=  Arg4_32  [A0StP+#-(( 4*4)+ARO)] D1Ar3=Arg3_32  [A0StP+#-(( 3*4)+ARO)]
; D0Ar2=  Arg2_32  [A0StP+#-(( 2*4)+ARO)] D1Ar2=Arg1_32  [A0StP+#-(( 1*4)+ARO)]
;                                    ; 'Frame area'
; A0FrP-> D0FrT, D1RtP,
;         D0.5, D1.5,
;         D0.6, D1.6,
;         D0.7, D1.7,
;                                    ; 'Locals area'
;         Loc0_32  [A0StP+# (( 0*4)-LCS)],      Loc1_32 [A0StP+# (( 1*4)-LCS)]
;               .... other locals
;         Locn_32  [A0StP+# (( n*4)-LCS)]
;                                    ; 'Outgoing args area'
;         Outm_32  [A0StP+#- ( m*4)]            .... other outgoing args
;         Out8_32  [A0StP+#- ( 1*4)]            Out7_32  [A0StP+#- ( 1*4)]
; A0StP-> (Out1_32-Out6_32 in regs D1Ar1-D0Ar6)
;
; The exit sequence for a non-leaf routine can use the frame pointer created
; in the entry sequence to optimise the recovery of the full state-
;
;   MGETL   D0FrT,D0.5,D0.6,D0.7,[A0FrP]
;   SUB     A0StP,A0FrP,#(ARS+FRS)
;   MOV     A0FrP,D0FrT
;   MOV     PC,D1RtP
;
; Having described the most complex non-leaf case above, it is worth noting
; that if a routine is a leaf and does not use any of the caller-preserved
; state. The routine can be implemented as-
;
;   ADD     A0StP,A0StP,#LCS
;   .... body of routine
;   SUB     A0StP,A0StP,#LCS
;   MOV     PC,D1RtP
;
; The stack adjustments can also be omitted if no local storage is required.
;
; Another exit sequence structure is more applicable if for a leaf routine
; with no local frame pointer saved/generated in which the call saved
; registers need to be saved and restored-
;
;   MSETL   [A0StP],D0.5,D0.6,D0.7   ; Hence FRS is 0x18, ARS is 0x00
;   ADD     A0StP,A0StP,#LCS
;   .... body of routine
;   GETL    D0.5,D1.5,[A0StP+#((0*8)-(FRS+LCS))]
;   GETL    D0.6,D1.6,[A0StP+#((1*8)-(FRS+LCS))]
;   GETL    D0.7,D1.7,[A0StP+#((2*8)-(FRS+LCS))]
;   SUB     A0StP,A0StP,#(ARS+FRS+LCS)
;   MOV     PC,D1RtP
;
; Lastly, to support profiling assembler code should use a fixed entry/exit
; sequence if the trigger define _GMON_ASM is defined-
;
;   #ifndef _GMON_ASM
;   ... optimised entry code
;   #else
;   ; Profiling entry case
;   MOV     D0FrT,A0FrP              ; Save and calculate new frame pointer
;   ADD     A0FrP,A0StP,#(ARS)
;   MSETL   [A0StP],...,D0FrT,... or SETL    [A0FrP],D0FrT,D1RtP
;   CALLR   D0FrT,_mcount_wrapper
;   #endif
;   ... body of routine
;   #ifndef _GMON_ASM
;   ... optimised exit code
;   #else
;   ; Profiling exit case
;   MGETL   D0FrT,...,[A0FrP]     or GETL    D0FrT,D1RtP,[A0FrP++]
;   SUB     A0StP,A0FrP,#(ARS+FRS)
;   MOV     A0FrP,D0FrT
;   MOV     PC,D1RtP
;   #endif


; -------------------------------------------------------------------------
;                         CONTROL UNIT REGISTERS
; -------------------------------------------------------------------------
;
; See the assembler guide, hardware documentation, or the field values
; defined below for some details of the use of these registers.
*/
#define TXENABLE    CT.0    /* Need to define bit-field values in these */
#define TXMODE      CT.1
#define TXSTATUS    CT.2    /* DEFAULT 0x00020000 */
#define TXRPT       CT.3
#define TXTIMER     CT.4
#define TXL1START   CT.5
#define TXL1END     CT.6
#define TXL1COUNT   CT.7
#define TXL2START   CT.8
#define TXL2END     CT.9
#define TXL2COUNT   CT.10
#define TXBPOBITS   CT.11
#define TXMRSIZE    CT.12
#define TXTIMERI    CT.13
#define TXDRCTRL    CT.14  /* DEFAULT 0x0XXXF0F0 */
#define TXDRSIZE    CT.15
#define TXCATCH0    CT.16
#define TXCATCH1    CT.17
#define TXCATCH2    CT.18
#define TXCATCH3    CT.19

#ifdef METAC_2_1
#define TXDEFR      CT.20
#define TXCPRS      CT.21
#endif

#define TXINTERN0   CT.23
#define TXAMAREG0   CT.24
#define TXAMAREG1   CT.25
#define TXAMAREG2   CT.26
#define TXAMAREG3   CT.27
#define TXDIVTIME   CT.28   /* DEFAULT 0x00000001 */
#define TXPRIVEXT   CT.29   /* DEFAULT 0x003B0000 */
#define TXTACTCYC   CT.30
#define TXIDLECYC   CT.31

/*****************************************************************************
 *                        CONTROL UNIT REGISTER BITS
 ****************************************************************************/
/*
 * The following registers and where appropriate the sub-fields of those
 * registers are defined for pervasive use in controlling program flow.
 */

/*
 * TXENABLE register fields - only the thread id is routinely useful
 */
#define TXENABLE_REGNUM 0
#define TXENABLE_THREAD_BITS       0x00000700
#define TXENABLE_THREAD_S          8
#define TXENABLE_REV_STEP_BITS     0x000000F0
#define TXENABLE_REV_STEP_S        4

/*
 * TXMODE register - controls extensions of the instruction set
 */
#define TXMODE_REGNUM 1
#define     TXMODE_DEFAULT  0   /* All fields default to zero */

/*
 * TXSTATUS register - contains a couple of stable bits that can be used
 *      to determine the privilege processing level and interrupt
 *      processing level of the current thread.
 */
#define TXSTATUS_REGNUM 2
#define TXSTATUS_PSTAT_BIT         0x00020000   /* -> Privilege active      */
#define TXSTATUS_PSTAT_S           17
#define TXSTATUS_ISTAT_BIT         0x00010000   /* -> In interrupt state    */
#define TXSTATUS_ISTAT_S           16

/*
 * These are all relatively boring registers, mostly full 32-bit
 */
#define TXRPT_REGNUM     3  /* Repeat counter for XFR... instructions   */
#define TXTIMER_REGNUM   4  /* Timer-- causes timer trigger on overflow */
#define TXL1START_REGNUM 5  /* Hardware Loop 1 Start-PC/End-PC/Count    */
#define TXL1END_REGNUM   6
#define TXL1COUNT_REGNUM 7
#define TXL2START_REGNUM 8  /* Hardware Loop 2 Start-PC/End-PC/Count    */
#define TXL2END_REGNUM   9
#define TXL2COUNT_REGNUM 10
#define TXBPOBITS_REGNUM 11 /* Branch predict override bits - tune perf */
#define TXTIMERI_REGNUM  13 /* Timer-- time based interrupt trigger     */

/*
 * TXDIVTIME register is routinely read to calculate the time-base for
 * the TXTIMER register.
 */
#define TXDIVTIME_REGNUM 28
#define     TXDIVTIME_DIV_BITS 0x000000FF
#define     TXDIVTIME_DIV_S    0
#define     TXDIVTIME_DIV_MIN  0x00000001   /* Maximum resolution       */
#define     TXDIVTIME_DIV_MAX  0x00000100   /* 1/1 -> 1/256 resolution  */
#define     TXDIVTIME_BASE_HZ  1000000      /* Timers run at 1Mhz @1/1  */

/*
 * TXPRIVEXT register can be consulted to decide if write access to a
 *    part of the threads register set is not permitted when in
 *    unprivileged mode (PSTAT == 0).
 */
#define TXPRIVEXT_REGNUM 29
#define     TXPRIVEXT_COPRO_BITS    0xFF000000 /* Co-processor 0-7 */
#define     TXPRIVEXT_COPRO_S       24
#ifndef METAC_1_2
#define     TXPRIVEXT_TXTIMER_BIT   0x00080000 /* TXTIMER   priv */
#define     TXPRIVEXT_TRACE_BIT     0x00040000 /* TTEXEC|TTCTRL|GTEXEC */
#endif
#define     TXPRIVEXT_TXTRIGGER_BIT 0x00020000 /* TXSTAT|TXMASK|TXPOLL */
#define     TXPRIVEXT_TXGBLCREG_BIT 0x00010000 /* Global common regs */
#define     TXPRIVEXT_CBPRIV_BIT    0x00008000 /* Mem i/f dump priv */
#define     TXPRIVEXT_ILOCK_BIT     0x00004000 /* LOCK inst priv */
#define     TXPRIVEXT_TXITACCYC_BIT 0x00002000 /* TXIDLECYC|TXTACTCYC */
#define     TXPRIVEXT_TXDIVTIME_BIT 0x00001000 /* TXDIVTIME priv */
#define     TXPRIVEXT_TXAMAREGX_BIT 0x00000800 /* TXAMAREGX priv */
#define     TXPRIVEXT_TXTIMERI_BIT  0x00000400 /* TXTIMERI  priv */
#define     TXPRIVEXT_TXSTATUS_BIT  0x00000200 /* TXSTATUS  priv */
#define     TXPRIVEXT_TXDISABLE_BIT 0x00000100 /* TXENABLE  priv */
#ifndef METAC_1_2
#define     TXPRIVEXT_MINIMON_BIT   0x00000080 /* Enable Minim features */
#define     TXPRIVEXT_OLDBCCON_BIT  0x00000020 /* Restore Static predictions */
#define     TXPRIVEXT_ALIGNREW_BIT  0x00000010 /* Align & precise checks */
#endif
#define     TXPRIVEXT_KEEPPRI_BIT   0x00000008 /* Use AMA_Priority if ISTAT=1*/
#define     TXPRIVEXT_TXTOGGLEI_BIT 0x00000001 /* TX.....I  priv */

/*
 * TXTACTCYC register - counts instructions issued for this thread
 */
#define TXTACTCYC_REGNUM  30
#define     TXTACTCYC_COUNT_MASK    0x00FFFFFF

/*
 * TXIDLECYC register - counts idle cycles
 */
#define TXIDLECYC_REGNUM  31
#define     TXIDLECYC_COUNT_MASK    0x00FFFFFF

/*****************************************************************************
 *                             DSP EXTENSIONS
 ****************************************************************************/
/*
 * The following values relate to fields and controls that only a program
 * using the DSP extensions of the META instruction set need to know.
 */


#ifndef METAC_1_2
/*
 * Allow co-processor hardware to replace the read pipeline data source in
 * appropriate cases.
 */
#define TXMODE_RDCPEN_BIT       0x00800000
#endif

/*
 * Address unit addressing modes
 */
#define TXMODE_A1ADDR_BITS  0x00007000
#define TXMODE_A1ADDR_S     12
#define TXMODE_A0ADDR_BITS  0x00000700
#define TXMODE_A0ADDR_S     8
#define     TXMODE_AXADDR_MODULO 3
#define     TXMODE_AXADDR_REVB   4
#define     TXMODE_AXADDR_REVW   5
#define     TXMODE_AXADDR_REVD   6
#define     TXMODE_AXADDR_REVL   7

/*
 * Data unit OverScale select (default 0 -> normal, 1 -> top 16 bits)
 */
#define TXMODE_DXOVERSCALE_BIT  0x00000080

/*
 * Data unit MX mode select (default 0 -> MX16, 1 -> MX8)
 */
#define TXMODE_M8_BIT         0x00000040

/*
 * Data unit accumulator saturation point (default -> 40 bit accumulator)
 */
#define TXMODE_DXACCSAT_BIT 0x00000020 /* Set for 32-bit accumulator */

/*
 * Data unit accumulator saturation enable (default 0 -> no saturation)
 */
#define TXMODE_DXSAT_BIT    0x00000010

/*
 * Data unit master rounding control (default 0 -> normal, 1 -> convergent)
 */
#define TXMODE_DXROUNDING_BIT   0x00000008

/*
 * Data unit product shift for fractional arithmetic (default off)
 */
#define TXMODE_DXPRODSHIFT_BIT  0x00000004

/*
 * Select the arithmetic mode (multiply mostly) for both data units
 */
#define TXMODE_DXARITH_BITS 0x00000003
#define     TXMODE_DXARITH_32  3
#define     TXMODE_DXARITH_32H 2
#define     TXMODE_DXARITH_S16 1
#define     TXMODE_DXARITH_16  0

/*
 * TXMRSIZE register value only relevant when DSP modulo addressing active
 */
#define TXMRSIZE_REGNUM 12
#define     TXMRSIZE_MIN    0x0002  /* 0, 1 -> normal addressing logic */
#define     TXMRSIZE_MAX    0xFFFF

/*
 * TXDRCTRL register can be used to detect the actaul size of the DSP RAM
 * partitions allocated to this thread.
 */
#define TXDRCTRL_REGNUM 14
#define     TXDRCTRL_SINESIZE_BITS  0x0F000000
#define     TXDRCTRL_SINESIZE_S     24
#define     TXDRCTRL_RAMSZPOW_BITS  0x001F0000  /* Limit = (1<<RAMSZPOW)-1 */
#define     TXDRCTRL_RAMSZPOW_S     16
#define     TXDRCTRL_D1RSZAND_BITS  0x0000F000  /* Mask top 4 bits - D1 */
#define     TXDRCTRL_D1RSZAND_S     12
#define     TXDRCTRL_D0RSZAND_BITS  0x000000F0  /* Mask top 4 bits - D0 */
#define     TXDRCTRL_D0RSZAND_S     4
/* Given extracted RAMSZPOW and DnRSZAND fields this returns the size */
#define     TXDRCTRL_DXSIZE(Pow, AndBits) \
				((((~(AndBits)) & 0x0f) + 1) << ((Pow)-4))

/*
 * TXDRSIZE register provides modulo addressing options for each DSP RAM
 */
#define TXDRSIZE_REGNUM 15
#define     TXDRSIZE_R1MOD_BITS       0xFFFF0000
#define     TXDRSIZE_R1MOD_S          16
#define     TXDRSIZE_R0MOD_BITS       0x0000FFFF
#define     TXDRSIZE_R0MOD_S          0

#define     TXDRSIZE_RBRAD_SCALE_BITS 0x70000000
#define     TXDRSIZE_RBRAD_SCALE_S    28
#define     TXDRSIZE_RBMODSIZE_BITS   0x0FFF0000
#define     TXDRSIZE_RBMODSIZE_S      16
#define     TXDRSIZE_RARAD_SCALE_BITS 0x00007000
#define     TXDRSIZE_RARAD_SCALE_S    12
#define     TXDRSIZE_RAMODSIZE_BITS   0x00000FFF
#define     TXDRSIZE_RAMODSIZE_S      0

/*****************************************************************************
 *                       DEFERRED and BUS ERROR EXTENSION
 ****************************************************************************/

/*
 * TXDEFR register - Deferred exception control
 */
#define TXDEFR_REGNUM 20
#define     TXDEFR_DEFAULT  0   /* All fields default to zero */

/*
 * Bus error state is a multi-bit positive/negative event notification from
 * the bus infrastructure.
 */
#define     TXDEFR_BUS_ERR_BIT    0x80000000  /* Set if error (LSB STATE) */
#define     TXDEFR_BUS_ERRI_BIT   0x40000000  /* Fetch returned error */
#define     TXDEFR_BUS_STATE_BITS 0x3F000000  /* Bus event/state data */
#define     TXDEFR_BUS_STATE_S    24
#define     TXDEFR_BUS_TRIG_BIT   0x00800000  /* Set when bus error seen */

/*
 * Bus events are collected by background code in a deferred manner unless
 * selected to trigger an extended interrupt HALT trigger when they occur.
 */
#define     TXDEFR_BUS_ICTRL_BIT  0x00000080  /* Enable interrupt trigger */

/*
 * CHIP Automatic Mips Allocation control registers
 * ------------------------------------------------
 */

/* CT Bank AMA Registers */
#define TXAMAREG0_REGNUM 24
#ifdef METAC_1_2
#define     TXAMAREG0_CTRL_BITS       0x07000000
#else /* METAC_1_2 */
#define     TXAMAREG0_RCOFF_BIT       0x08000000
#define     TXAMAREG0_DLINEHLT_BIT    0x04000000
#define     TXAMAREG0_DLINEDIS_BIT    0x02000000
#define     TXAMAREG0_CYCSTRICT_BIT   0x01000000
#define     TXAMAREG0_CTRL_BITS       (TXAMAREG0_RCOFF_BIT |    \
				       TXAMAREG0_DLINEHLT_BIT | \
				       TXAMAREG0_DLINEDIS_BIT | \
				       TXAMAREG0_CYCSTRICT_BIT)
#endif /* !METAC_1_2 */
#define     TXAMAREG0_CTRL_S           24
#define     TXAMAREG0_MDM_BIT         0x00400000
#define     TXAMAREG0_MPF_BIT         0x00200000
#define     TXAMAREG0_MPE_BIT         0x00100000
#define     TXAMAREG0_MASK_BITS       (TXAMAREG0_MDM_BIT | \
				       TXAMAREG0_MPF_BIT | \
				       TXAMAREG0_MPE_BIT)
#define     TXAMAREG0_MASK_S          20
#define     TXAMAREG0_SDM_BIT         0x00040000
#define     TXAMAREG0_SPF_BIT         0x00020000
#define     TXAMAREG0_SPE_BIT         0x00010000
#define     TXAMAREG0_STATUS_BITS     (TXAMAREG0_SDM_BIT | \
				       TXAMAREG0_SPF_BIT | \
				       TXAMAREG0_SPE_BIT)
#define     TXAMAREG0_STATUS_S        16
#define     TXAMAREG0_PRIORITY_BITS   0x0000FF00
#define     TXAMAREG0_PRIORITY_S      8
#define     TXAMAREG0_BVALUE_BITS     0x000000FF
#define     TXAMAREG0_BVALUE_S  0

#define TXAMAREG1_REGNUM 25
#define     TXAMAREG1_DELAYC_BITS     0x07FFFFFF
#define     TXAMAREG1_DELAYC_S  0

#define TXAMAREG2_REGNUM 26
#ifdef METAC_1_2
#define     TXAMAREG2_DLINEC_BITS     0x00FFFFFF
#define     TXAMAREG2_DLINEC_S        0
#else /* METAC_1_2 */
#define     TXAMAREG2_IRQPRIORITY_BIT 0xFF000000
#define     TXAMAREG2_IRQPRIORITY_S   24
#define     TXAMAREG2_DLINEC_BITS     0x00FFFFF0
#define     TXAMAREG2_DLINEC_S        4
#endif /* !METAC_1_2 */

#define TXAMAREG3_REGNUM 27
#define     TXAMAREG2_AMABLOCK_BIT    0x00080000
#define     TXAMAREG2_AMAC_BITS       0x0000FFFF
#define     TXAMAREG2_AMAC_S          0

/*****************************************************************************
 *                                FPU EXTENSIONS
 ****************************************************************************/
/*
 * The following registers only exist in FPU enabled cores.
 */

/*
 * TXMODE register - FPU rounding mode control/status fields
 */
#define     TXMODE_FPURMODE_BITS     0x00030000
#define     TXMODE_FPURMODE_S        16
#define     TXMODE_FPURMODEWRITE_BIT 0x00040000  /* Set to change FPURMODE */

/*
 * TXDEFR register - FPU exception handling/state is a significant source
 *   of deferrable errors. Run-time S/W can move handling to interrupt level
 *   using DEFR instruction to collect state.
 */
#define     TXDEFR_FPE_FE_BITS       0x003F0000  /* Set by FPU_FE events */
#define     TXDEFR_FPE_FE_S          16

#define     TXDEFR_FPE_INEXACT_FE_BIT   0x010000
#define     TXDEFR_FPE_UNDERFLOW_FE_BIT 0x020000
#define     TXDEFR_FPE_OVERFLOW_FE_BIT  0x040000
#define     TXDEFR_FPE_DIVBYZERO_FE_BIT 0x080000
#define     TXDEFR_FPE_INVALID_FE_BIT   0x100000
#define     TXDEFR_FPE_DENORMAL_FE_BIT  0x200000

#define     TXDEFR_FPE_ICTRL_BITS    0x000003F   /* Route to interrupts */
#define     TXDEFR_FPE_ICTRL_S       0

#define     TXDEFR_FPE_INEXACT_ICTRL_BIT   0x01
#define     TXDEFR_FPE_UNDERFLOW_ICTRL_BIT 0x02
#define     TXDEFR_FPE_OVERFLOW_ICTRL_BIT  0x04
#define     TXDEFR_FPE_DIVBYZERO_ICTRL_BIT 0x08
#define     TXDEFR_FPE_INVALID_ICTRL_BIT   0x10
#define     TXDEFR_FPE_DENORMAL_ICTRL_BIT  0x20

/*
 * DETAILED FPU RELATED VALUES
 * ---------------------------
 */

/*
 * Rounding mode field in TXMODE can hold a number of logical values
 */
#define METAG_FPURMODE_TONEAREST  0x0      /* Default */
#define METAG_FPURMODE_TOWARDZERO 0x1
#define METAG_FPURMODE_UPWARD     0x2
#define METAG_FPURMODE_DOWNWARD   0x3

/*
 * In order to set the TXMODE register field that controls the rounding mode
 * an extra bit must be set in the value written versus that read in order
 * to gate writes to the rounding mode field. This allows other non-FPU code
 * to modify TXMODE without knowledge of the FPU units presence and not
 * influence the FPU rounding mode. This macro adds the required bit so new
 * rounding modes are accepted.
 */
#define TXMODE_FPURMODE_SET(FPURMode) \
	(TXMODE_FPURMODEWRITE_BIT + ((FPURMode)<<TXMODE_FPURMODE_S))

/*
 * To successfully restore TXMODE to zero at the end of the function the
 * following value (rather than zero) must be used.
 */
#define TXMODE_FPURMODE_RESET (TXMODE_FPURMODEWRITE_BIT)

/*
 * In TXSTATUS a special bit exists to indicate if FPU H/W has been accessed
 * since it was last reset.
 */
#define TXSTATUS_FPACTIVE_BIT  0x01000000

/*
 * Exception state (see TXDEFR_FPU_FE_*) and enabling (for interrupt
 * level processing (see TXDEFR_FPU_ICTRL_*) are controlled by similar
 * bit mask locations within each field.
 */
#define METAG_FPU_FE_INEXACT   0x01
#define METAG_FPU_FE_UNDERFLOW 0x02
#define METAG_FPU_FE_OVERFLOW  0x04
#define METAG_FPU_FE_DIVBYZERO 0x08
#define METAG_FPU_FE_INVALID   0x10
#define METAG_FPU_FE_DENORMAL  0x20
#define METAG_FPU_FE_ALL_EXCEPT (METAG_FPU_FE_INEXACT   | \
				 METAG_FPU_FE_UNDERFLOW | \
				 METAG_FPU_FE_OVERFLOW  | \
				 METAG_FPU_FE_DIVBYZERO | \
				 METAG_FPU_FE_INVALID   | \
				 METAG_FPU_FE_DENORMAL)

/*****************************************************************************
 *             THREAD CONTROL, ERROR, OR INTERRUPT STATE EXTENSIONS
 ****************************************************************************/
/*
 * The following values are only relevant to code that externally controls
 * threads, handles errors/interrupts, and/or set-up interrupt/error handlers
 * for subsequent use.
 */

/*
 * TXENABLE register fields - only ENABLE_BIT is potentially read/write
 */
#define TXENABLE_MAJOR_REV_BITS    0xFF000000
#define TXENABLE_MAJOR_REV_S       24
#define TXENABLE_MINOR_REV_BITS    0x00FF0000
#define TXENABLE_MINOR_REV_S       16
#define TXENABLE_CLASS_BITS        0x0000F000
#define TXENABLE_CLASS_S           12
#define TXENABLE_CLASS_DSP             0x0 /* -> DSP Thread */
#define TXENABLE_CLASS_LDSP            0x8 /* -> DSP LITE Thread */
#define TXENABLE_CLASS_GP              0xC /* -> General Purpose Thread */
#define     TXENABLE_CLASSALT_LFPU       0x2 /*  Set to indicate LITE FPU */
#define     TXENABLE_CLASSALT_FPUR8      0x1 /*  Set to indicate 8xFPU regs */
#define TXENABLE_MTXARCH_BIT       0x00000800
#define TXENABLE_STEP_REV_BITS     0x000000F0
#define TXENABLE_STEP_REV_S        4
#define TXENABLE_STOPPED_BIT       0x00000004   /* TXOFF due to ENABLE->0 */
#define TXENABLE_OFF_BIT           0x00000002   /* Thread is in off state */
#define TXENABLE_ENABLE_BIT        0x00000001   /* Set if running */

/*
 * TXSTATUS register - used by external/internal interrupt/error handler
 */
#define TXSTATUS_CB1MARKER_BIT     0x00800000   /* -> int level mem state */
#define TXSTATUS_CBMARKER_BIT      0x00400000   /* -> mem i/f state dumped */
#define TXSTATUS_MEM_FAULT_BITS    0x00300000
#define TXSTATUS_MEM_FAULT_S       20
#define     TXSTATUS_MEMFAULT_NONE  0x0 /* -> No memory fault       */
#define     TXSTATUS_MEMFAULT_GEN   0x1 /* -> General fault         */
#define     TXSTATUS_MEMFAULT_PF    0x2 /* -> Page fault            */
#define     TXSTATUS_MEMFAULT_RO    0x3 /* -> Read only fault       */
#define TXSTATUS_MAJOR_HALT_BITS   0x000C0000
#define TXSTATUS_MAJOR_HALT_S      18
#define     TXSTATUS_MAJHALT_TRAP 0x0   /* -> SWITCH inst used      */
#define     TXSTATUS_MAJHALT_INST 0x1   /* -> Unknown inst or fetch */
#define     TXSTATUS_MAJHALT_PRIV 0x2   /* -> Internal privilege    */
#define     TXSTATUS_MAJHALT_MEM  0x3   /* -> Memory i/f fault      */
#define TXSTATUS_L_STEP_BITS       0x00000800   /* -> Progress of L oper    */
#define TXSTATUS_LSM_STEP_BITS     0x00000700   /* -> Progress of L/S mult  */
#define TXSTATUS_LSM_STEP_S        8
#define TXSTATUS_FLAG_BITS         0x0000001F   /* -> All the flags         */
#define TXSTATUS_SCC_BIT           0x00000010   /* -> Split-16 flags ...    */
#define TXSTATUS_SCF_LZ_BIT        0x00000008   /* -> Split-16 Low  Z flag  */
#define TXSTATUS_SCF_HZ_BIT        0x00000004   /* -> Split-16 High Z flag  */
#define TXSTATUS_SCF_HC_BIT        0x00000002   /* -> Split-16 High C flag  */
#define TXSTATUS_SCF_LC_BIT        0x00000001   /* -> Split-16 Low  C flag  */
#define TXSTATUS_CF_Z_BIT          0x00000008   /* -> Condition Z flag      */
#define TXSTATUS_CF_N_BIT          0x00000004   /* -> Condition N flag      */
#define TXSTATUS_CF_O_BIT          0x00000002   /* -> Condition O flag      */
#define TXSTATUS_CF_C_BIT          0x00000001   /* -> Condition C flag      */

/*
 * TXCATCH0-3 register contents may store information on a memory operation
 * that has failed if the bit TXSTATUS_CBMARKER_BIT is set.
 */
#define TXCATCH0_REGNUM 16
#define TXCATCH1_REGNUM 17
#define     TXCATCH1_ADDR_BITS   0xFFFFFFFF   /* TXCATCH1 is Addr 0-31 */
#define     TXCATCH1_ADDR_S      0
#define TXCATCH2_REGNUM 18
#define     TXCATCH2_DATA0_BITS  0xFFFFFFFF   /* TXCATCH2 is Data 0-31 */
#define     TXCATCH2_DATA0_S     0
#define TXCATCH3_REGNUM 19
#define     TXCATCH3_DATA1_BITS  0xFFFFFFFF   /* TXCATCH3 is Data 32-63 */
#define     TXCATCH3_DATA1_S     0

/*
 * Detailed catch state information
 * --------------------------------
 */

/* Contents of TXCATCH0 register */
#define     TXCATCH0_LDRXX_BITS  0xF8000000  /* Load destination reg 0-31 */
#define     TXCATCH0_LDRXX_S     27
#define     TXCATCH0_LDDST_BITS  0x07FF0000  /* Load destination bits */
#define     TXCATCH0_LDDST_S     16
#define         TXCATCH0_LDDST_D1DSP 0x400   /* One bit set if it's a LOAD */
#define         TXCATCH0_LDDST_D0DSP 0x200
#define         TXCATCH0_LDDST_TMPLT 0x100
#define         TXCATCH0_LDDST_TR    0x080
#ifdef METAC_2_1
#define         TXCATCH0_LDDST_FPU   0x040
#endif
#define         TXCATCH0_LDDST_PC    0x020
#define         TXCATCH0_LDDST_A1    0x010
#define         TXCATCH0_LDDST_A0    0x008
#define         TXCATCH0_LDDST_D1    0x004
#define         TXCATCH0_LDDST_D0    0x002
#define         TXCATCH0_LDDST_CT    0x001
#ifdef METAC_2_1
#define     TXCATCH0_WATCHSTOP_BIT 0x00004000  /* Set if Data Watch set fault */
#endif
#define     TXCATCH0_WATCHS_BIT  0x00004000  /* Set if Data Watch set fault */
#define     TXCATCH0_WATCH1_BIT  0x00002000  /* Set if Data Watch 1 matches */
#define     TXCATCH0_WATCH0_BIT  0x00001000  /* Set if Data Watch 0 matches */
#define     TXCATCH0_FAULT_BITS  0x00000C00  /* See TXSTATUS_MEMFAULT_*     */
#define     TXCATCH0_FAULT_S     10
#define     TXCATCH0_PRIV_BIT    0x00000200  /* Privilege of transaction    */
#define     TXCATCH0_READ_BIT    0x00000100  /* Set for Read or Load cases  */

#ifdef METAC_2_1
/* LNKGET Marker bit in TXCATCH0 */
#define   TXCATCH0_LNKGET_MARKER_BIT 0x00000008
#define       TXCATCH0_PREPROC_BIT  0x00000004
#endif

/* Loads are indicated by one of the LDDST bits being set */
#define     TXCATCH0_LDM16_BIT   0x00000004  /* Load M16 flag */
#define     TXCATCH0_LDL2L1_BITS 0x00000003  /* Load data size L2,L1 */
#define     TXCATCH0_LDL2L1_S    0

/* Reads are indicated by the READ bit being set without LDDST bits */
#define     TXCATCH0_RAXX_BITS   0x0000001F  /* RAXX issue port for read */
#define     TXCATCH0_RAXX_S      0

/* Write operations are all that remain if READ bit is not set */
#define     TXCATCH0_WMASK_BITS  0x000000FF  /* Write byte lane mask */
#define     TXCATCH0_WMASK_S     0

#ifdef METAC_2_1

/* When a FPU exception is signalled then FPUSPEC == FPUSPEC_TAG */
#define     TXCATCH0_FPURDREG_BITS    0xF8000000
#define     TXCATCH0_FPURDREG_S       27
#define     TXCATCH0_FPUR1REG_BITS    0x07C00000
#define     TXCATCH0_FPUR1REG_S       22
#define     TXCATCH0_FPUSPEC_BITS     0x000F0000
#define     TXCATCH0_FPUSPEC_S        16
#define         TXCATCH0_FPUSPEC_TAG      0xF
#define     TXCATCH0_FPUINSTA_BIT     0x00001000
#define     TXCATCH0_FPUINSTQ_BIT     0x00000800
#define     TXCATCH0_FPUINSTZ_BIT     0x00000400
#define     TXCATCH0_FPUINSTN_BIT     0x00000200
#define     TXCATCH0_FPUINSTO3O_BIT   0x00000100
#define     TXCATCH0_FPUWIDTH_BITS    0x000000C0
#define     TXCATCH0_FPUWIDTH_S       6
#define         TXCATCH0_FPUWIDTH_FLOAT   0
#define         TXCATCH0_FPUWIDTH_DOUBLE  1
#define         TXCATCH0_FPUWIDTH_PAIRED  2
#define     TXCATCH0_FPUOPENC_BITS    0x0000003F
#define     TXCATCH0_FPUOPENC_S       0
#define         TXCATCH0_FPUOPENC_ADD     0  /* rop1=Rs1, rop3=Rs2 */
#define         TXCATCH0_FPUOPENC_SUB     1  /* rop1=Rs1, rop3=Rs2 */
#define         TXCATCH0_FPUOPENC_MUL     2  /* rop1=Rs1, rop2=Rs2 */
#define         TXCATCH0_FPUOPENC_ATOI    3  /* rop3=Rs */
#define         TXCATCH0_FPUOPENC_ATOX    4  /* rop3=Rs, uses #Imm */
#define         TXCATCH0_FPUOPENC_ITOA    5  /* rop3=Rs */
#define         TXCATCH0_FPUOPENC_XTOA    6  /* rop3=Rs, uses #Imm */
#define         TXCATCH0_FPUOPENC_ATOH    7  /* rop2=Rs */
#define         TXCATCH0_FPUOPENC_HTOA    8  /* rop2=Rs */
#define         TXCATCH0_FPUOPENC_DTOF    9  /* rop3=Rs */
#define         TXCATCH0_FPUOPENC_FTOD    10 /* rop3=Rs */
#define         TXCATCH0_FPUOPENC_DTOL    11 /* rop3=Rs */
#define         TXCATCH0_FPUOPENC_LTOD    12 /* rop3=Rs */
#define         TXCATCH0_FPUOPENC_DTOXL   13 /* rop3=Rs, uses #imm */
#define         TXCATCH0_FPUOPENC_XLTOD   14 /* rop3=Rs, uses #imm */
#define         TXCATCH0_FPUOPENC_CMP     15 /* rop1=Rs1, rop2=Rs2 */
#define         TXCATCH0_FPUOPENC_MIN     16 /* rop1=Rs1, rop2=Rs2 */
#define         TXCATCH0_FPUOPENC_MAX     17 /* rop1=Rs1, rop2=Rs2 */
#define         TXCATCH0_FPUOPENC_ADDRE   18 /* rop1=Rs1, rop3=Rs2 */
#define         TXCATCH0_FPUOPENC_SUBRE   19 /* rop1=Rs1, rop3=Rs2 */
#define         TXCATCH0_FPUOPENC_MULRE   20 /* rop1=Rs1, rop2=Rs2 */
#define         TXCATCH0_FPUOPENC_MXA     21 /* rop1=Rs1, rop2=Rs2, rop3=Rs3*/
#define         TXCATCH0_FPUOPENC_MXAS    22 /* rop1=Rs1, rop2=Rs2, rop3=Rs3*/
#define         TXCATCH0_FPUOPENC_MAR     23 /* rop1=Rs1, rop2=Rs2 */
#define         TXCATCH0_FPUOPENC_MARS    24 /* rop1=Rs1, rop2=Rs2 */
#define         TXCATCH0_FPUOPENC_MUZ     25 /* rop1=Rs1, rop2=Rs2, rop3=Rs3*/
#define         TXCATCH0_FPUOPENC_MUZS    26 /* rop1=Rs1, rop2=Rs2, rop3=Rs3*/
#define         TXCATCH0_FPUOPENC_RCP     27 /* rop2=Rs */
#define         TXCATCH0_FPUOPENC_RSQ     28 /* rop2=Rs */

/* For floating point exceptions TXCATCH1 is used to carry extra data */
#define     TXCATCH1_FPUR2REG_BITS    0xF8000000
#define     TXCATCH1_FPUR2REG_S       27
#define     TXCATCH1_FPUR3REG_BITS    0x07C00000  /* Undefined if O3O set */
#define     TXCATCH1_FPUR3REG_S       22
#define     TXCATCH1_FPUIMM16_BITS    0x0000FFFF
#define     TXCATCH1_FPUIMM16_S       0

#endif /* METAC_2_1 */

/*
 * TXDIVTIME register used to hold the partial base address of memory i/f
 * state dump area. Now deprecated.
 */
#define     TXDIVTIME_CBBASE_MASK    0x03FFFE00
#define     TXDIVTIME_CBBASE_LINBASE 0x80000000
#define     TXDIVTIME_CBBASE_LINBOFF 0x00000000 /* BGnd state */
#define     TXDIVTIME_CBBASE_LINIOFF 0x00000100 /* Int  state */

/*
 * TXDIVTIME register used to indicate if the read pipeline was dirty when a
 * thread was interrupted, halted, or generated an exception. It is invalid
 * to attempt to issue a further pipeline read address while the read
 * pipeline is in the dirty state.
 */
#define     TXDIVTIME_RPDIRTY_BIT   0x80000000

/*
 * Further bits in the TXDIVTIME register allow interrupt handling code to
 * short-cut the discovery the most significant bit last read from TXSTATI.
 *
 * This is the bit number of the trigger line that a low level interrupt
 * handler should acknowledge and then perhaps the index of a corresponding
 * handler function.
 */
#define     TXDIVTIME_IRQENC_BITS   0x0F000000
#define     TXDIVTIME_IRQENC_S      24

/*
 * If TXDIVTIME_RPVALID_BIT is set the read pipeline contained significant
 * information when the thread was interrupted|halted|exceptioned. Each slot
 * containing data is indicated by a one bit in the corresponding
 * TXDIVTIME_RPMASK_BITS bit (least significance bit relates to first
 * location in read pipeline - most likely to have the 1 state). Empty slots
 * contain zeroes with no interlock applied on reads if RPDIRTY is currently
 * set with RPMASK itself being read-only state.
 */
#define     TXDIVTIME_RPMASK_BITS 0x003F0000   /* -> Full (1) Empty (0) */
#define     TXDIVTIME_RPMASK_S    16

/*
 * TXPRIVEXT register can be used to single step thread execution and
 * enforce synchronous memory i/f address checking for debugging purposes.
 */
#define     TXPRIVEXT_TXSTEP_BIT    0x00000004
#define     TXPRIVEXT_MEMCHECK_BIT  0x00000002

/*
 * TXINTERNx registers holds internal state information for H/W debugging only
 */
#define TXINTERN0_REGNUM 23
#define     TXINTERN0_LOCK2_BITS  0xF0000000
#define     TXINTERN0_LOCK2_S     28
#define     TXINTERN0_LOCK1_BITS  0x0F000000
#define     TXINTERN0_LOCK1_S     24
#define     TXINTERN0_TIFDF_BITS  0x0000F000
#define     TXINTERN0_TIFDF_S     12
#define     TXINTERN0_TIFIB_BITS  0x00000F00
#define     TXINTERN0_TIFIB_S     8
#define     TXINTERN0_TIFAF_BITS  0x000000F0
#define     TXINTERN0_TIFAF_S     4
#define     TXINTERN0_MSTATE_BITS 0x0000000F
#define     TXINTERN0_MSTATE_S    0

/*
 * TXSTAT, TXMASK, TXPOLL, TXSTATI, TXMASKI, TXPOLLI registers from trigger
 * bank all have similar contents (upper kick count bits not in MASK regs)
 */
#define TXSTAT_REGNUM  0
#define     TXSTAT_TIMER_BIT    0x00000001
#define     TXSTAT_TIMER_S      0
#define     TXSTAT_KICK_BIT     0x00000002
#define     TXSTAT_KICK_S       1
#define     TXSTAT_DEFER_BIT    0x00000008
#define     TXSTAT_DEFER_S      3
#define     TXSTAT_EXTTRIG_BITS 0x0000FFF0
#define     TXSTAT_EXTTRIG_S    4
#define     TXSTAT_FPE_BITS     0x003F0000
#define     TXSTAT_FPE_S        16
#define     TXSTAT_FPE_DENORMAL_BIT    0x00200000
#define     TXSTAT_FPE_DENORMAL_S      21
#define     TXSTAT_FPE_INVALID_BIT     0x00100000
#define     TXSTAT_FPE_INVALID_S       20
#define     TXSTAT_FPE_DIVBYZERO_BIT   0x00080000
#define     TXSTAT_FPE_DIVBYZERO_S     19
#define     TXSTAT_FPE_OVERFLOW_BIT    0x00040000
#define     TXSTAT_FPE_OVERFLOW_S      18
#define     TXSTAT_FPE_UNDERFLOW_BIT   0x00020000
#define     TXSTAT_FPE_UNDERFLOW_S     17
#define     TXSTAT_FPE_INEXACT_BIT     0x00010000
#define     TXSTAT_FPE_INEXACT_S       16
#define     TXSTAT_BUSERR_BIT          0x00800000   /* Set if bus error/ack state */
#define     TXSTAT_BUSERR_S            23
#define         TXSTAT_BUSSTATE_BITS     0xFF000000 /* Read only */
#define         TXSTAT_BUSSTATE_S        24
#define     TXSTAT_KICKCNT_BITS 0xFFFF0000
#define     TXSTAT_KICKCNT_S    16
#define TXMASK_REGNUM  1
#define TXSTATI_REGNUM 2
#define     TXSTATI_BGNDHALT_BIT    0x00000004
#define TXMASKI_REGNUM 3
#define TXPOLL_REGNUM  4
#define TXPOLLI_REGNUM 6

/*
 * TXDRCTRL register can be used to partition the DSP RAM space available to
 * this thread at startup. This is achieved by offsetting the region allocated
 * to each thread.
 */
#define     TXDRCTRL_D1PARTOR_BITS  0x00000F00  /* OR's into top 4 bits */
#define     TXDRCTRL_D1PARTOR_S     8
#define     TXDRCTRL_D0PARTOR_BITS  0x0000000F  /* OR's into top 4 bits */
#define     TXDRCTRL_D0PARTOR_S     0
/* Given extracted Pow and Or fields this is threads base within DSP RAM */
#define     TXDRCTRL_DXBASE(Pow, Or)  ((Or)<<((Pow)-4))

/*****************************************************************************
 *                      RUN TIME TRACE CONTROL REGISTERS
 ****************************************************************************/
/*
 * The following values are only relevant to code that implements run-time
 *  trace features within the META Core
 */
#define TTEXEC      TT.0
#define TTCTRL      TT.1
#define TTMARK      TT.2
#define TTREC       TT.3
#define GTEXEC      TT.4

#define TTEXEC_REGNUM               0
#define     TTEXEC_EXTTRIGAND_BITS      0x7F000000
#define     TTEXEC_EXTTRIGAND_S         24
#define     TTEXEC_EXTTRIGEN_BIT        0x00008000
#define     TTEXEC_EXTTRIGMATCH_BITS    0x00007F00
#define     TTEXEC_EXTTRIGMATCH_S       8
#define     TTEXEC_TCMODE_BITS          0x00000003
#define     TTEXEC_TCMODE_S             0

#define TTCTRL_REGNUM               1
#define     TTCTRL_TRACETT_BITS         0x00008000
#define     TTCTRL_TRACETT_S            15
#define     TTCTRL_TRACEALL_BITS        0x00002000
#define     TTCTRL_TRACEALL_S           13
#ifdef METAC_2_1
#define     TTCTRL_TRACEALLTAG_BITS     0x00000400
#define     TTCTRL_TRACEALLTAG_S        10
#endif /* METAC_2_1 */
#define     TTCTRL_TRACETAG_BITS        0x00000200
#define     TTCTRL_TRACETAG_S           9
#define     TTCTRL_TRACETTPC_BITS       0x00000080
#define     TTCTRL_TRACETTPC_S          7
#define     TTCTRL_TRACEMPC_BITS        0x00000020
#define     TTCTRL_TRACEMPC_S           5
#define     TTCTRL_TRACEEN_BITS         0x00000008
#define     TTCTRL_TRACEEN_S            3
#define     TTCTRL_TRACEEN1_BITS        0x00000004
#define     TTCTRL_TRACEEN1_S           2
#define     TTCTRL_TRACEPC_BITS         0x00000002
#define     TTCTRL_TRACEPC_S            1

#ifdef METAC_2_1
#define TTMARK_REGNUM   2
#define TTMARK_BITS                 0xFFFFFFFF
#define TTMARK_S                    0x0

#define TTREC_REGNUM    3
#define TTREC_BITS                  0xFFFFFFFFFFFFFFFF
#define TTREC_S                     0x0
#endif /* METAC_2_1 */

#define GTEXEC_REGNUM               4
#define     GTEXEC_DCRUN_BITS           0x80000000
#define     GTEXEC_DCRUN_S              31
#define     GTEXEC_ICMODE_BITS          0x0C000000
#define     GTEXEC_ICMODE_S             26
#define     GTEXEC_TCMODE_BITS          0x03000000
#define     GTEXEC_TCMODE_S             24
#define     GTEXEC_PERF1CMODE_BITS      0x00040000
#define     GTEXEC_PERF1CMODE_S         18
#define     GTEXEC_PERF0CMODE_BITS      0x00010000
#define     GTEXEC_PERF0CMODE_S         16
#define     GTEXEC_REFMSEL_BITS         0x0000F000
#define     GTEXEC_REFMSEL_S            12
#define     GTEXEC_METRICTH_BITS        0x000003FF
#define     GTEXEC_METRICTH_S           0

#ifdef METAC_2_1
/*
 * Clock Control registers
 * -----------------------
 */
#define TXCLKCTRL_REGNUM        22

/*
 * Default setting is with clocks always on (DEFON), turning all clocks off
 * can only be done from external devices (OFF), enabling automatic clock
 * gating will allow clocks to stop as units fall idle.
 */
#define TXCLKCTRL_ALL_OFF       0x02222222
#define TXCLKCTRL_ALL_DEFON     0x01111111
#define TXCLKCTRL_ALL_AUTO      0x02222222

/*
 * Individual fields control caches, floating point and main data/addr units
 */
#define TXCLKCTRL_CLOCKIC_BITS  0x03000000
#define TXCLKCTRL_CLOCKIC_S     24
#define TXCLKCTRL_CLOCKDC_BITS  0x00300000
#define TXCLKCTRL_CLOCKDC_S     20
#define TXCLKCTRL_CLOCKFP_BITS  0x00030000
#define TXCLKCTRL_CLOCKFP_S     16
#define TXCLKCTRL_CLOCKD1_BITS  0x00003000
#define TXCLKCTRL_CLOCKD1_S     12
#define TXCLKCTRL_CLOCKD0_BITS  0x00000300
#define TXCLKCTRL_CLOCKD0_S     8
#define TXCLKCTRL_CLOCKA1_BITS  0x00000030
#define TXCLKCTRL_CLOCKA1_S     4
#define TXCLKCTRL_CLOCKA0_BITS  0x00000003
#define TXCLKCTRL_CLOCKA0_S     0

/*
 * Individual settings for each field are common
 */
#define TXCLKCTRL_CLOCKxx_OFF   0
#define TXCLKCTRL_CLOCKxx_DEFON 1
#define TXCLKCTRL_CLOCKxx_AUTO  2

#endif /* METAC_2_1 */

#ifdef METAC_2_1
/*
 * Fast interrupt new bits
 * ------------------------------------
 */
#define TXSTATUS_IPTOGGLE_BIT           0x80000000 /* Prev PToggle of TXPRIVEXT */
#define TXSTATUS_ISTATE_BIT             0x40000000 /* IState bit */
#define TXSTATUS_IWAIT_BIT              0x20000000 /* wait indefinitely in decision step*/
#define TXSTATUS_IEXCEPT_BIT            0x10000000 /* Indicate an exception occured */
#define TXSTATUS_IRPCOUNT_BITS          0x0E000000 /* Number of 'dirty' date entries*/
#define TXSTATUS_IRPCOUNT_S             25
#define TXSTATUS_IRQSTAT_BITS           0x0000F000 /* IRQEnc bits, trigger or interrupts */
#define TXSTATUS_IRQSTAT_S              12
#define TXSTATUS_LNKSETOK_BIT           0x00000020 /* LNKSetOK bit, successful LNKSET */

/* New fields in TXDE for fast interrupt system */
#define TXDIVTIME_IACTIVE_BIT           0x00008000 /* Enable new interrupt system */
#define TXDIVTIME_INONEST_BIT           0x00004000 /* Gate nested interrupt */
#define TXDIVTIME_IREGIDXGATE_BIT       0x00002000 /* gate of the IRegIdex field */
#define TXDIVTIME_IREGIDX_BITS          0x00001E00 /* Index of A0.0/1 replaces */
#define TXDIVTIME_IREGIDX_S             9
#define TXDIVTIME_NOST_BIT              0x00000100 /* disable superthreading bit */
#endif

#endif /* _ASM_METAG_REGS_H_ */
