xref: /freebsd/sys/arm64/coresight/coresight_etm4x.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
1b1670691SRuslan Bukin /*-
2*c9ea007cSRuslan Bukin  * Copyright (c) 2018-2020 Ruslan Bukin <br@bsdpad.com>
3b1670691SRuslan Bukin  * All rights reserved.
4b1670691SRuslan Bukin  *
5b1670691SRuslan Bukin  * This software was developed by BAE Systems, the University of Cambridge
6b1670691SRuslan Bukin  * Computer Laboratory, and Memorial University under DARPA/AFRL contract
7b1670691SRuslan Bukin  * FA8650-15-C-7558 ("CADETS"), as part of the DARPA Transparent Computing
8b1670691SRuslan Bukin  * (TC) research program.
9b1670691SRuslan Bukin  *
10b1670691SRuslan Bukin  * Redistribution and use in source and binary forms, with or without
11b1670691SRuslan Bukin  * modification, are permitted provided that the following conditions
12b1670691SRuslan Bukin  * are met:
13b1670691SRuslan Bukin  * 1. Redistributions of source code must retain the above copyright
14b1670691SRuslan Bukin  *    notice, this list of conditions and the following disclaimer.
15b1670691SRuslan Bukin  * 2. Redistributions in binary form must reproduce the above copyright
16b1670691SRuslan Bukin  *    notice, this list of conditions and the following disclaimer in the
17b1670691SRuslan Bukin  *    documentation and/or other materials provided with the distribution.
18b1670691SRuslan Bukin  *
19b1670691SRuslan Bukin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20b1670691SRuslan Bukin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21b1670691SRuslan Bukin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22b1670691SRuslan Bukin  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23b1670691SRuslan Bukin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24b1670691SRuslan Bukin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25b1670691SRuslan Bukin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26b1670691SRuslan Bukin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27b1670691SRuslan Bukin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28b1670691SRuslan Bukin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29b1670691SRuslan Bukin  * SUCH DAMAGE.
30b1670691SRuslan Bukin  */
31b1670691SRuslan Bukin 
32b1670691SRuslan Bukin #ifndef	_ARM64_CORESIGHT_ETM4X_H_
33b1670691SRuslan Bukin #define	_ARM64_CORESIGHT_ETM4X_H_
34b1670691SRuslan Bukin 
35b1670691SRuslan Bukin #define	TRCPRGCTLR		0x004 /* Trace Programming Control Register */
36b1670691SRuslan Bukin #define	 TRCPRGCTLR_EN		(1 << 0) /* Trace unit enable bit */
37b1670691SRuslan Bukin #define	TRCPROCSELR		0x008 /* Trace PE Select Control Register */
38b1670691SRuslan Bukin #define	TRCSTATR		0x00C /* Trace Trace Status Register */
39b1670691SRuslan Bukin #define	 TRCSTATR_PMSTABLE	(1 << 1) /* The programmers' model is stable. */
40b1670691SRuslan Bukin #define	 TRCSTATR_IDLE		(1 << 0) /* The trace unit is idle. */
41b1670691SRuslan Bukin #define	TRCCONFIGR		0x010 /* Trace Trace Configuration Register */
42b1670691SRuslan Bukin #define	 TRCCONFIGR_DV		(1 << 17) /* Data value tracing is enabled when INSTP0 is not 0b00 */
43b1670691SRuslan Bukin #define	 TRCCONFIGR_DA		(1 << 16) /* Data address tracing is enabled when INSTP0 is not 0b00. */
44b1670691SRuslan Bukin #define	 TRCCONFIGR_VMIDOPT	(1 << 15) /* Control bit to configure the Virtual context identifier value */
45b1670691SRuslan Bukin #define	 TRCCONFIGR_QE_S	13 /* Q element enable field */
46b1670691SRuslan Bukin #define	 TRCCONFIGR_QE_M	(0x3 << TRCCONFIGR_QE_S)
47b1670691SRuslan Bukin #define	 TRCCONFIGR_RS		(1 << 12) /* Return stack enable bit */
48b1670691SRuslan Bukin #define	 TRCCONFIGR_TS		(1 << 11) /* Global timestamp tracing is enabled. */
49b1670691SRuslan Bukin #define	 TRCCONFIGR_COND_S	8 /* Conditional instruction tracing bit. */
50b1670691SRuslan Bukin #define	 TRCCONFIGR_COND_M	(0x7 << TRCCONFIGR_COND_S)
51b1670691SRuslan Bukin #define	 TRCCONFIGR_COND_DIS	0
52b1670691SRuslan Bukin #define	 TRCCONFIGR_COND_LDR	(1 << TRCCONFIGR_COND_S) /* Conditional load instructions are traced. */
53b1670691SRuslan Bukin #define	 TRCCONFIGR_COND_STR	(2 << TRCCONFIGR_COND_S) /* Conditional store instructions are traced. */
54b1670691SRuslan Bukin #define	 TRCCONFIGR_COND_LDRSTR	(3 << TRCCONFIGR_COND_S) /* Conditional load and store instructions are traced. */
55b1670691SRuslan Bukin #define	 TRCCONFIGR_COND_ALL	(7 << TRCCONFIGR_COND_S) /* All conditional instructions are traced. */
56b1670691SRuslan Bukin #define	 TRCCONFIGR_VMID	(1 << 7) /* Virtual context identifier tracing is enabled. */
57b1670691SRuslan Bukin #define	 TRCCONFIGR_CID		(1 << 6) /* Context ID tracing is enabled. */
58b1670691SRuslan Bukin #define	 TRCCONFIGR_CCI		(1 << 4) /* Cycle counting in the instruction trace is enabled. */
59b1670691SRuslan Bukin #define	 TRCCONFIGR_BB		(1 << 3) /* Branch broadcast mode is enabled. */
60b1670691SRuslan Bukin #define	 TRCCONFIGR_INSTP0_S	1 /* Instruction P0 field. */
61b1670691SRuslan Bukin #define	 TRCCONFIGR_INSTP0_M	(0x3 << TRCCONFIGR_INSTP0_S)
62b1670691SRuslan Bukin #define	 TRCCONFIGR_INSTP0_NONE	0 /* Do not trace load and store instructions as P0 instructions. */
63b1670691SRuslan Bukin #define	 TRCCONFIGR_INSTP0_LDR	(1 << TRCCONFIGR_INSTP0_S) /* Trace load instructions as P0 instructions. */
64b1670691SRuslan Bukin #define	 TRCCONFIGR_INSTP0_STR	(2 << TRCCONFIGR_INSTP0_S) /* Trace store instructions as P0 instructions. */
65b1670691SRuslan Bukin #define	 TRCCONFIGR_INSTP0_LDRSTR (3 << TRCCONFIGR_INSTP0_S) /* Trace load and store instructions as P0 instr. */
66b1670691SRuslan Bukin #define	TRCAUXCTLR		0x018 /* Trace Auxiliary Control Register */
67b1670691SRuslan Bukin #define	TRCEVENTCTL0R		0x020 /* Trace Event Control 0 Register */
68b1670691SRuslan Bukin #define	TRCEVENTCTL1R		0x024 /* Trace Event Control 1 Register */
69b1670691SRuslan Bukin #define	TRCSTALLCTLR		0x02C /* Trace Stall Control Register */
70b1670691SRuslan Bukin #define	TRCTSCTLR		0x030 /* Trace Global Timestamp Control Register */
71b1670691SRuslan Bukin #define	TRCSYNCPR		0x034 /* Trace Synchronization Period Register */
72b1670691SRuslan Bukin #define	 TRCSYNCPR_PERIOD_S	0
73b1670691SRuslan Bukin #define	 TRCSYNCPR_PERIOD_M	0x1f
74b1670691SRuslan Bukin #define	 TRCSYNCPR_1K		(10 << TRCSYNCPR_PERIOD_S)
75b1670691SRuslan Bukin #define	 TRCSYNCPR_2K		(11 << TRCSYNCPR_PERIOD_S)
76b1670691SRuslan Bukin #define	 TRCSYNCPR_4K		(12 << TRCSYNCPR_PERIOD_S)
77b1670691SRuslan Bukin #define	TRCCCCTLR		0x038 /* Trace Cycle Count Control Register */
78b1670691SRuslan Bukin #define	TRCBBCTLR		0x03C /* Trace Branch Broadcast Control Register */
79b1670691SRuslan Bukin #define	TRCTRACEIDR		0x040 /* Trace Trace ID Register */
80b1670691SRuslan Bukin #define	TRCQCTLR		0x044 /* Trace Q Element Control Register */
81b1670691SRuslan Bukin #define	 TRCQCTLR_MODE_INC	(1 << 8) /* Include mode. */
82b1670691SRuslan Bukin #define	TRCVICTLR		0x080 /* Trace ViewInst Main Control Register */
83b1670691SRuslan Bukin #define	 TRCVICTLR_SSSTATUS	(1 << 9) /* The start/stop logic is in the started state. */
84b1670691SRuslan Bukin #define	 TRCVICTLR_EXLEVEL_NS_S	20
85b1670691SRuslan Bukin #define	 TRCVICTLR_EXLEVEL_NS_M	(0xf << TRCVICTLR_EXLEVEL_NS_S)
86b1670691SRuslan Bukin #define	 TRCVICTLR_EXLEVEL_NS(n) (0x1 << ((n) + TRCVICTLR_EXLEVEL_NS_S))
87b1670691SRuslan Bukin #define	 TRCVICTLR_EXLEVEL_S_S	16
88b1670691SRuslan Bukin #define	 TRCVICTLR_EXLEVEL_S_M	(0xf << TRCVICTLR_EXLEVEL_S_S)
89b1670691SRuslan Bukin #define	 TRCVICTLR_EXLEVEL_S(n)	(0x1 << ((n) + TRCVICTLR_EXLEVEL_S_S))
90b1670691SRuslan Bukin #define	 EVENT_SEL_S		0
91b1670691SRuslan Bukin #define	 EVENT_SEL_M		(0x1f << EVENT_SEL_S)
92b1670691SRuslan Bukin #define	TRCVIIECTLR		0x084 /* Trace ViewInst Include/Exclude Control Register */
93b1670691SRuslan Bukin #define	 TRCVIIECTLR_INCLUDE_S	0
94b1670691SRuslan Bukin #define	TRCVISSCTLR		0x088 /* Trace ViewInst Start/Stop Control Register */
95b1670691SRuslan Bukin #define	TRCVIPCSSCTLR		0x08C /* Trace ViewInst Start/Stop PE Comparator Control Register */
96b1670691SRuslan Bukin #define	TRCVDCTLR		0x0A0 /* Trace ViewData Main Control Register */
97b1670691SRuslan Bukin #define	 TRCVDCTLR_TRCEXDATA	(1 << 12) /* Exception and exception return data transfers are traced */
98b1670691SRuslan Bukin #define	 TRCVDCTLR_TBI		(1 << 11) /* The trace unit assigns bits[63:56] to have the same value as bits[63:56] of the data address. */
99b1670691SRuslan Bukin #define	 TRCVDCTLR_PCREL	(1 << 10) /* The trace unit does not trace the address or value portions of PC-relative transfers. */
100b1670691SRuslan Bukin #define	 TRCVDCTLR_SPREL_S	8
101b1670691SRuslan Bukin #define	 TRCVDCTLR_SPREL_M	(0x3 << TRCVDCTLR_SPREL_S)
102b1670691SRuslan Bukin #define	 TRCVDCTLR_EVENT_S	0
103b1670691SRuslan Bukin #define	 TRCVDCTLR_EVENT_M	(0xff << TRCVDCTLR_EVENT_S)
104b1670691SRuslan Bukin #define	TRCVDSACCTLR		0x0A4 /* Trace ViewData Include/Exclude Single Address Comparator Control Register */
105b1670691SRuslan Bukin #define	TRCVDARCCTLR		0x0A8 /* Trace ViewData Include/Exclude Address Range Comparator Control Register */
106b1670691SRuslan Bukin #define	TRCSEQEVR(n)		(0x100 + (n) * 0x4)	/* Trace Sequencer State Transition Control Register [n=0-2] */
107b1670691SRuslan Bukin #define	TRCSEQRSTEVR		0x118 /* Trace Sequencer Reset Control Register */
108b1670691SRuslan Bukin #define	TRCSEQSTR		0x11C /* Trace Sequencer State Register */
109b1670691SRuslan Bukin #define	TRCEXTINSELR		0x120 /* Trace External Input Select Register */
110b1670691SRuslan Bukin #define	TRCCNTRLDVR(n)		(0x140 + (n) * 0x4) /* 32 Trace Counter Reload Value Register [n=0-3] */
111b1670691SRuslan Bukin #define	TRCCNTCTLR(n)		(0x150 + (n) * 0x4) /* 32 Trace Counter Control Register [n=0-3] */
112b1670691SRuslan Bukin #define	TRCCNTVR(n)		(0x160 + (n) * 0x4) /* 32 Trace Counter Value Register [n=0-3] */
113b1670691SRuslan Bukin #define	TRCIMSPEC(n)		(0x1C0 + (n) * 0x4)	/* Trace IMPLEMENTATION DEFINED register [n=0-7] */
114b1670691SRuslan Bukin 
115b1670691SRuslan Bukin #define	TRCIDR0(n)		(0x1E0 + 0x4 * (n))
116b1670691SRuslan Bukin #define	TRCIDR8(n)		(0x180 + 0x4 * (n))
117b1670691SRuslan Bukin #define	TRCIDR(n)		((n > 7) ? TRCIDR8(n) : TRCIDR0(n))
118b1670691SRuslan Bukin #define	 TRCIDR1_TRCARCHMAJ_S	8
119b1670691SRuslan Bukin #define	 TRCIDR1_TRCARCHMAJ_M	(0xf << TRCIDR1_TRCARCHMAJ_S)
120b1670691SRuslan Bukin #define	 TRCIDR1_TRCARCHMIN_S	4
121b1670691SRuslan Bukin #define	 TRCIDR1_TRCARCHMIN_M	(0xf << TRCIDR1_TRCARCHMIN_S)
122b1670691SRuslan Bukin 
123b1670691SRuslan Bukin #define	TRCRSCTLR(n)		(0x200 + (n) * 0x4) /* Trace Resource Selection Control Register [n=2-31] */
124b1670691SRuslan Bukin #define	TRCSSCCR(n)		(0x280 + (n) * 0x4) /* Trace Single-shot Comparator Control Register [n=0-7] */
125b1670691SRuslan Bukin #define	TRCSSCSR(n)		(0x2A0 + (n) * 0x4) /* Trace Single-shot Comparator Status Register [n=0-7] */
126b1670691SRuslan Bukin #define	TRCSSPCICR(n)		(0x2C0 + (n) * 0x4) /* Trace Single-shot PE Comparator Input Control [n=0-7] */
127b1670691SRuslan Bukin #define	TRCOSLAR		0x300 /* Management OS Lock Access Register */
128b1670691SRuslan Bukin #define	TRCOSLSR		0x304 /* Management OS Lock Status Register */
129b1670691SRuslan Bukin #define	TRCPDCR			0x310 /* Management PowerDown Control Register */
130b1670691SRuslan Bukin #define	TRCPDSR			0x314 /* Management PowerDown Status Register */
131b1670691SRuslan Bukin #define	TRCACVR(n)		(0x400 + (n) * 0x8) /* Trace Address Comparator Value Register [n=0-15] */
132b1670691SRuslan Bukin #define	TRCACATR(n)		(0x480 + (n) * 0x8) /* Trace Address Comparator Access Type Register [n=0-15] */
133b1670691SRuslan Bukin #define	 TRCACATR_DTBM		(1 << 21)
134b1670691SRuslan Bukin #define	 TRCACATR_DATARANGE	(1 << 20)
135b1670691SRuslan Bukin #define	 TRCACATR_DATASIZE_S	18
136b1670691SRuslan Bukin #define	 TRCACATR_DATASIZE_M	(0x3 << TRCACATR_DATASIZE_S)
137b1670691SRuslan Bukin #define	 TRCACATR_DATASIZE_B	(0x0 << TRCACATR_DATASIZE_S)
138b1670691SRuslan Bukin #define	 TRCACATR_DATASIZE_HW	(0x1 << TRCACATR_DATASIZE_S)
139b1670691SRuslan Bukin #define	 TRCACATR_DATASIZE_W	(0x2 << TRCACATR_DATASIZE_S)
140b1670691SRuslan Bukin #define	 TRCACATR_DATASIZE_DW	(0x3 << TRCACATR_DATASIZE_S)
141b1670691SRuslan Bukin #define	 TRCACATR_DATAMATCH_S	16
142b1670691SRuslan Bukin #define	 TRCACATR_DATAMATCH_M	(0x3 << TRCACATR_DATAMATCH_S)
143b1670691SRuslan Bukin #define	 TRCACATR_EXLEVEL_S_S	8
144b1670691SRuslan Bukin #define	 TRCACATR_EXLEVEL_S_M	(0xf << TRCACATR_EXLEVEL_S_S)
145b1670691SRuslan Bukin #define	 TRCACATR_EXLEVEL_S(n)	(0x1 << ((n) + TRCACATR_EXLEVEL_S_S))
146b1670691SRuslan Bukin #define	 TRCACATR_EXLEVEL_NS_S	12
147b1670691SRuslan Bukin #define	 TRCACATR_EXLEVEL_NS_M	(0xf << TRCACATR_EXLEVEL_NS_S)
148b1670691SRuslan Bukin #define	 TRCACATR_EXLEVEL_NS(n)	(0x1 << ((n) + TRCACATR_EXLEVEL_NS_S))
149b1670691SRuslan Bukin #define	TRCDVCVR(n)		(0x500 + (n) * 0x8) /* Trace Data Value Comparator Value Register [n=0-7] */
150b1670691SRuslan Bukin #define	TRCDVCMR(n)		(0x580 + (n) * 0x8) /* Trace Data Value Comparator Mask Register [n=0-7] */
151b1670691SRuslan Bukin #define	TRCCIDCVR(n)		(0x600 + (n) * 0x8) /* Trace Context ID Comparator Value Register [n=0-7] */
152b1670691SRuslan Bukin #define	TRCVMIDCVR(n)		(0x640 + (n) * 0x8) /* Trace Virtual context identifier Comparator Value [n=0-7] */
153b1670691SRuslan Bukin #define	TRCCIDCCTLR0		0x680 /* Trace Context ID Comparator Control Register 0 */
154b1670691SRuslan Bukin #define	TRCCIDCCTLR1		0x684 /* Trace Context ID Comparator Control Register 1 */
155b1670691SRuslan Bukin #define	TRCVMIDCCTLR0		0x688 /* Trace Virtual context identifier Comparator Control Register 0 */
156b1670691SRuslan Bukin #define	TRCVMIDCCTLR1		0x68C /* Trace Virtual context identifier Comparator Control Register 1 */
157b1670691SRuslan Bukin #define	TRCITCTRL		0xF00 /* Management Integration Mode Control register */
158b1670691SRuslan Bukin #define	TRCCLAIMSET		0xFA0 /* Trace Claim Tag Set register */
159b1670691SRuslan Bukin #define	TRCCLAIMCLR		0xFA4 /* Trace Claim Tag Clear register */
160b1670691SRuslan Bukin #define	TRCDEVAFF0		0xFA8 /* Management Device Affinity register 0 */
161b1670691SRuslan Bukin #define	TRCDEVAFF1		0xFAC /* Management Device Affinity register 1 */
162b1670691SRuslan Bukin #define	TRCLAR			0xFB0 /* Management Software Lock Access Register */
163b1670691SRuslan Bukin #define	TRCLSR			0xFB4 /* Management Software Lock Status Register */
164b1670691SRuslan Bukin #define	TRCAUTHSTATUS		0xFB8 /* Management Authentication Status register */
165b1670691SRuslan Bukin #define	TRCDEVARCH		0xFBC /* Management Device Architecture register */
166b1670691SRuslan Bukin #define	TRCDEVID		0xFC8 /* Management Device ID register */
167b1670691SRuslan Bukin #define	TRCDEVTYPE		0xFCC /* Management Device Type register */
168b1670691SRuslan Bukin #define	TRCPIDR4		0xFD0 /* Management Peripheral ID4 Register */
169b1670691SRuslan Bukin #define	TRCPIDR(n)		(0xFE0 + (n) * 0x4)	/* Management Peripheral IDn Register [n=0-3] */
170b1670691SRuslan Bukin #define	TRCPIDR567(n)		(0xFD4 + ((n) - 5) * 0x4) /*  Management Peripheral ID5 to Peripheral ID7 Registers */
171b1670691SRuslan Bukin #define	TRCCIDR(n)		(0xFF0 + (n) * 0x4)	/* Management Component IDn Register [n=0-4] */
172b1670691SRuslan Bukin 
173*c9ea007cSRuslan Bukin DECLARE_CLASS(etm_driver);
174*c9ea007cSRuslan Bukin 
175*c9ea007cSRuslan Bukin struct etm_softc {
176*c9ea007cSRuslan Bukin 	struct resource			*res;
177*c9ea007cSRuslan Bukin 	struct coresight_platform_data	*pdata;
178*c9ea007cSRuslan Bukin };
179*c9ea007cSRuslan Bukin 
180*c9ea007cSRuslan Bukin int etm_attach(device_t dev);
181*c9ea007cSRuslan Bukin 
182b1670691SRuslan Bukin #endif /* !_ARM64_CORESIGHT_ETM4X_H_ */
183