| 1 |
|
| 2 |
|
| 3 |
|
| 4 | |
| 5 | * mcfdebug.h -- ColdFire Debug Module support.
|
| 6 | *
|
| 7 | * (C) Copyright 2001, Lineo Inc. (www.lineo.com)
|
| 8 |
|
| 9 |
|
| 10 |
|
| 11 | #ifndef mcfdebug_h
|
| 12 | #define mcfdebug_h
|
| 13 |
|
| 14 |
|
| 15 |
|
| 16 | #define MCFDEBUG_CSR 0x0
|
| 17 | #define MCFDEBUG_BAAR 0x5
|
| 18 | #define MCFDEBUG_AATR 0x6
|
| 19 | #define MCFDEBUG_TDR 0x7
|
| 20 | #define MCFDEBUG_PBR 0x8
|
| 21 | #define MCFDEBUG_PBMR 0x9
|
| 22 | #define MCFDEBUG_ABHR 0xc
|
| 23 | #define MCFDEBUG_ABLR 0xd
|
| 24 | #define MCFDEBUG_DBR 0xe
|
| 25 | #define MCFDEBUG_DBMR 0xf
|
| 26 |
|
| 27 |
|
| 28 | #define MCFDEBUG_TDR_TRC_DISP 0x00000000
|
| 29 | #define MCFDEBUG_TDR_TRC_HALT 0x40000000
|
| 30 | #define MCFDEBUG_TDR_TRC_INTR 0x80000000
|
| 31 | #define MCFDEBUG_TDR_LXT1 0x00004000
|
| 32 | #define MCFDEBUG_TDR_LXT2 0x00008000
|
| 33 | #define MCFDEBUG_TDR_EBL1 0x00002000
|
| 34 | #define MCFDEBUG_TDR_EBL2 0x20000000
|
| 35 | #define MCFDEBUG_TDR_EDLW1 0x00001000
|
| 36 | #define MCFDEBUG_TDR_EDLW2 0x10000000
|
| 37 | #define MCFDEBUG_TDR_EDWL1 0x00000800
|
| 38 | #define MCFDEBUG_TDR_EDWL2 0x08000000
|
| 39 | #define MCFDEBUG_TDR_EDWU1 0x00000400
|
| 40 | #define MCFDEBUG_TDR_EDWU2 0x04000000
|
| 41 | #define MCFDEBUG_TDR_EDLL1 0x00000200
|
| 42 | #define MCFDEBUG_TDR_EDLL2 0x02000000
|
| 43 | #define MCFDEBUG_TDR_EDLM1 0x00000100
|
| 44 | #define MCFDEBUG_TDR_EDLM2 0x01000000
|
| 45 | #define MCFDEBUG_TDR_EDUM1 0x00000080
|
| 46 | #define MCFDEBUG_TDR_EDUM2 0x00800000
|
| 47 | #define MCFDEBUG_TDR_EDUU1 0x00000040
|
| 48 | #define MCFDEBUG_TDR_EDUU2 0x00400000
|
| 49 | #define MCFDEBUG_TDR_DI1 0x00000020
|
| 50 | #define MCFDEBUG_TDR_DI2 0x00200000
|
| 51 | #define MCFDEBUG_TDR_EAI1 0x00000010
|
| 52 | #define MCFDEBUG_TDR_EAI2 0x00100000
|
| 53 | #define MCFDEBUG_TDR_EAR1 0x00000008
|
| 54 | #define MCFDEBUG_TDR_EAR2 0x00080000
|
| 55 | #define MCFDEBUG_TDR_EAL1 0x00000004
|
| 56 | #define MCFDEBUG_TDR_EAL2 0x00040000
|
| 57 | #define MCFDEBUG_TDR_EPC1 0x00000002
|
| 58 | #define MCFDEBUG_TDR_EPC2 0x00020000
|
| 59 | #define MCFDEBUG_TDR_PCI1 0x00000001
|
| 60 | #define MCFDEBUG_TDR_PCI2 0x00010000
|
| 61 |
|
| 62 |
|
| 63 | #define MCFDEBUG_AAR_RESET 0x00000005
|
| 64 |
|
| 65 |
|
| 66 |
|
| 67 | #define MCFDEBUG_CSR_RESET 0x00100000
|
| 68 | #define MCFDEBUG_CSR_PSTCLK 0x00020000
|
| 69 | #define MCFDEBUG_CSR_IPW 0x00010000
|
| 70 | #define MCFDEBUG_CSR_MAP 0x00008000
|
| 71 | #define MCFDEBUG_CSR_TRC 0x00004000
|
| 72 | #define MCFDEBUG_CSR_EMU 0x00002000
|
| 73 | #define MCFDEBUG_CSR_DDC_READ 0x00000800
|
| 74 | #define MCFDEBUG_CSR_DDC_WRITE 0x00001000
|
| 75 | #define MCFDEBUG_CSR_UHE 0x00000400
|
| 76 | #define MCFDEBUG_CSR_BTB0 0x00000000
|
| 77 | #define MCFDEBUG_CSR_BTB2 0x00000100
|
| 78 | #define MCFDEBUG_CSR_BTB3 0x00000200
|
| 79 | #define MCFDEBUG_CSR_BTB4 0x00000300
|
| 80 | #define MCFDEBUG_CSR_NPL 0x00000040
|
| 81 | #define MCFDEBUG_CSR_SSM 0x00000010
|
| 82 |
|
| 83 |
|
| 84 | #define MCFDEBUG_BAAR_RESET 0x00000005
|
| 85 |
|
| 86 |
|
| 87 |
|
| 88 | |
| 89 | * and value can be relatively easily specified. The biggest hassle here is
|
| 90 | * that the debug module instructions (2 longs) must be long word aligned and
|
| 91 | * some pointer fiddling is performed to ensure this.
|
| 92 |
|
| 93 | static inline void wdebug(int reg, unsigned long data) {
|
| 94 | unsigned short dbg_spc[6];
|
| 95 | unsigned short *dbg;
|
| 96 |
|
| 97 | |
| 98 | dbg = (unsigned short *)((((unsigned long)dbg_spc) + 3) & 0xfffffffc);
|
| 99 |
|
| 100 | |
| 101 | dbg[0] = 0x2c80 | (reg & 0xf);
|
| 102 | dbg[1] = (data >> 16) & 0xffff;
|
| 103 | dbg[2] = data & 0xffff;
|
| 104 | dbg[3] = 0;
|
| 105 |
|
| 106 | |
| 107 | #if 0 |
| 108 | // This strain is for gas which doesn't have the wdebug instructions defined
|
| 109 | asm( "move.l %0, %%a0\n\t"
|
| 110 | ".word 0xfbd0\n\t"
|
| 111 | ".word 0x0003\n\t"
|
| 112 | :: "g" (dbg) : "a0");
|
| 113 | #else
|
| 114 | |
| 115 | asm( "wdebug (%0)" :: "a" (dbg));
|
| 116 | #endif
|
| 117 | }
|
| 118 |
|
| 119 | #endif
|