xref: /rk3399_rockchip-uboot/include/iotrace.h (revision aa53233a15e22ae207436e4015a69d24f06c2703)
1*aa53233aSSimon Glass /*
2*aa53233aSSimon Glass  * Copyright (c) 2014 Google, Inc.
3*aa53233aSSimon Glass  *
4*aa53233aSSimon Glass  * SPDX-License-Identifier:     GPL-2.0+
5*aa53233aSSimon Glass  */
6*aa53233aSSimon Glass 
7*aa53233aSSimon Glass #ifndef __IOTRACE_H
8*aa53233aSSimon Glass #define __IOTRACE_H
9*aa53233aSSimon Glass 
10*aa53233aSSimon Glass #include <linux/types.h>
11*aa53233aSSimon Glass 
12*aa53233aSSimon Glass /*
13*aa53233aSSimon Glass  * This file is designed to be included in arch/<arch>/include/asm/io.h.
14*aa53233aSSimon Glass  * It redirects all IO access through a tracing/checksumming feature for
15*aa53233aSSimon Glass  * testing purposes.
16*aa53233aSSimon Glass  */
17*aa53233aSSimon Glass 
18*aa53233aSSimon Glass #if defined(CONFIG_IO_TRACE) && !defined(IOTRACE_IMPL) && \
19*aa53233aSSimon Glass 	!defined(CONFIG_SPL_BUILD)
20*aa53233aSSimon Glass 
21*aa53233aSSimon Glass #undef readl
22*aa53233aSSimon Glass #define readl(addr)	iotrace_readl((const void *)(addr))
23*aa53233aSSimon Glass 
24*aa53233aSSimon Glass #undef writel
25*aa53233aSSimon Glass #define writel(val, addr)	iotrace_writel(val, (const void *)(addr))
26*aa53233aSSimon Glass 
27*aa53233aSSimon Glass #undef readw
28*aa53233aSSimon Glass #define readw(addr)	iotrace_readw((const void *)(addr))
29*aa53233aSSimon Glass 
30*aa53233aSSimon Glass #undef writew
31*aa53233aSSimon Glass #define writew(val, addr)	iotrace_writew(val, (const void *)(addr))
32*aa53233aSSimon Glass 
33*aa53233aSSimon Glass #undef readb
34*aa53233aSSimon Glass #define readb(addr)	iotrace_readb((const void *)(addr))
35*aa53233aSSimon Glass 
36*aa53233aSSimon Glass #undef writeb
37*aa53233aSSimon Glass #define writeb(val, addr)	iotrace_writeb(val, (const void *)(addr))
38*aa53233aSSimon Glass 
39*aa53233aSSimon Glass #endif
40*aa53233aSSimon Glass 
41*aa53233aSSimon Glass /* Tracing functions which mirror their io.h counterparts */
42*aa53233aSSimon Glass u32 iotrace_readl(const void *ptr);
43*aa53233aSSimon Glass void iotrace_writel(ulong value, const void *ptr);
44*aa53233aSSimon Glass u16 iotrace_readw(const void *ptr);
45*aa53233aSSimon Glass void iotrace_writew(ulong value, const void *ptr);
46*aa53233aSSimon Glass u8 iotrace_readb(const void *ptr);
47*aa53233aSSimon Glass void iotrace_writeb(ulong value, const void *ptr);
48*aa53233aSSimon Glass 
49*aa53233aSSimon Glass /**
50*aa53233aSSimon Glass  * iotrace_reset_checksum() - Reset the iotrace checksum
51*aa53233aSSimon Glass  */
52*aa53233aSSimon Glass void iotrace_reset_checksum(void);
53*aa53233aSSimon Glass 
54*aa53233aSSimon Glass /**
55*aa53233aSSimon Glass  * iotrace_get_checksum() - Get the current checksum value
56*aa53233aSSimon Glass  *
57*aa53233aSSimon Glass  * @return currect checksum value
58*aa53233aSSimon Glass  */
59*aa53233aSSimon Glass u32 iotrace_get_checksum(void);
60*aa53233aSSimon Glass 
61*aa53233aSSimon Glass /**
62*aa53233aSSimon Glass  * iotrace_set_enabled() - Set whether iotracing is enabled or not
63*aa53233aSSimon Glass  *
64*aa53233aSSimon Glass  * This controls whether the checksum is updated and a trace record added
65*aa53233aSSimon Glass  * for each I/O access.
66*aa53233aSSimon Glass  *
67*aa53233aSSimon Glass  * @enable: true to enable iotracing, false to disable
68*aa53233aSSimon Glass  */
69*aa53233aSSimon Glass void iotrace_set_enabled(int enable);
70*aa53233aSSimon Glass 
71*aa53233aSSimon Glass /**
72*aa53233aSSimon Glass  * iotrace_get_enabled() - Get whether iotracing is enabled or not
73*aa53233aSSimon Glass  *
74*aa53233aSSimon Glass  * @return true if enabled, false if disabled
75*aa53233aSSimon Glass  */
76*aa53233aSSimon Glass int iotrace_get_enabled(void);
77*aa53233aSSimon Glass 
78*aa53233aSSimon Glass /**
79*aa53233aSSimon Glass  * iotrace_set_buffer() - Set position and size of iotrace buffer
80*aa53233aSSimon Glass  *
81*aa53233aSSimon Glass  * Defines where the iotrace buffer goes, and resets the output pointer to
82*aa53233aSSimon Glass  * the start of the buffer.
83*aa53233aSSimon Glass  *
84*aa53233aSSimon Glass  * The buffer can be 0 size in which case the checksum is updated but no
85*aa53233aSSimon Glass  * trace records are writen. If the buffer is exhausted, the offset will
86*aa53233aSSimon Glass  * continue to increase but not new data will be written.
87*aa53233aSSimon Glass  *
88*aa53233aSSimon Glass  * @start: Start address of buffer
89*aa53233aSSimon Glass  * @size: Size of buffer in bytes
90*aa53233aSSimon Glass  */
91*aa53233aSSimon Glass void iotrace_set_buffer(ulong start, ulong size);
92*aa53233aSSimon Glass 
93*aa53233aSSimon Glass /**
94*aa53233aSSimon Glass  * iotrace_get_buffer() - Get buffer information
95*aa53233aSSimon Glass  *
96*aa53233aSSimon Glass  * @start: Returns start address of buffer
97*aa53233aSSimon Glass  * @size: Returns size of buffer in bytes
98*aa53233aSSimon Glass  * @offset: Returns the byte offset where the next output trace record will
99*aa53233aSSimon Glass  * @count: Returns the number of trace records recorded
100*aa53233aSSimon Glass  * be written (or would be if the buffer was large enough)
101*aa53233aSSimon Glass  */
102*aa53233aSSimon Glass void iotrace_get_buffer(ulong *start, ulong *size, ulong *offset, ulong *count);
103*aa53233aSSimon Glass 
104*aa53233aSSimon Glass #endif /* __IOTRACE_H */
105