Blame view

include/iotrace.h 3.88 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  /* SPDX-License-Identifier: GPL-2.0+ */
aa53233a1   Simon Glass   Add an I/O tracin...
2
3
  /*
   * Copyright (c) 2014 Google, Inc.
aa53233a1   Simon Glass   Add an I/O tracin...
4
5
6
7
   */
  
  #ifndef __IOTRACE_H
  #define __IOTRACE_H
7e9be3ea3   Ramon Fried   iotrace: move rec...
8
  //#include <common.h>
aa53233a1   Simon Glass   Add an I/O tracin...
9
  #include <linux/types.h>
7e9be3ea3   Ramon Fried   iotrace: move rec...
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
  /* Support up to the machine word length for now */
  typedef ulong iovalue_t;
  
  enum iotrace_flags {
  	IOT_8 = 0,
  	IOT_16,
  	IOT_32,
  
  	IOT_READ = 0 << 3,
  	IOT_WRITE = 1 << 3,
  };
  
  /**
   * struct iotrace_record - Holds a single I/O trace record
   *
   * @flags: I/O access type
   * @timestamp: Timestamp of access
   * @addr: Address of access
   * @value: Value written or read
   */
  struct iotrace_record {
  	enum iotrace_flags flags;
  	u64 timestamp;
  	phys_addr_t addr;
  	iovalue_t value;
  };
aa53233a1   Simon Glass   Add an I/O tracin...
36
37
38
39
40
41
42
43
44
45
46
47
48
  /*
   * This file is designed to be included in arch/<arch>/include/asm/io.h.
   * It redirects all IO access through a tracing/checksumming feature for
   * testing purposes.
   */
  
  #if defined(CONFIG_IO_TRACE) && !defined(IOTRACE_IMPL) && \
  	!defined(CONFIG_SPL_BUILD)
  
  #undef readl
  #define readl(addr)	iotrace_readl((const void *)(addr))
  
  #undef writel
9859dc76e   Simon Glass   trace: Remove the...
49
  #define writel(val, addr)	iotrace_writel(val, (void *)(addr))
aa53233a1   Simon Glass   Add an I/O tracin...
50
51
52
53
54
  
  #undef readw
  #define readw(addr)	iotrace_readw((const void *)(addr))
  
  #undef writew
9859dc76e   Simon Glass   trace: Remove the...
55
  #define writew(val, addr)	iotrace_writew(val, (void *)(addr))
aa53233a1   Simon Glass   Add an I/O tracin...
56
57
  
  #undef readb
709e98b7b   Simon Glass   Allow iotrace byt...
58
  #define readb(addr)	iotrace_readb((const void *)(uintptr_t)addr)
aa53233a1   Simon Glass   Add an I/O tracin...
59
60
  
  #undef writeb
9859dc76e   Simon Glass   trace: Remove the...
61
  #define writeb(val, addr)	iotrace_writeb(val, (void *)(uintptr_t)addr)
aa53233a1   Simon Glass   Add an I/O tracin...
62
63
64
65
66
  
  #endif
  
  /* Tracing functions which mirror their io.h counterparts */
  u32 iotrace_readl(const void *ptr);
9859dc76e   Simon Glass   trace: Remove the...
67
  void iotrace_writel(ulong value, void *ptr);
aa53233a1   Simon Glass   Add an I/O tracin...
68
  u16 iotrace_readw(const void *ptr);
9859dc76e   Simon Glass   trace: Remove the...
69
  void iotrace_writew(ulong value, void *ptr);
aa53233a1   Simon Glass   Add an I/O tracin...
70
  u8 iotrace_readb(const void *ptr);
9859dc76e   Simon Glass   trace: Remove the...
71
  void iotrace_writeb(ulong value, void *ptr);
aa53233a1   Simon Glass   Add an I/O tracin...
72
73
74
75
76
77
78
79
80
81
82
83
84
85
  
  /**
   * iotrace_reset_checksum() - Reset the iotrace checksum
   */
  void iotrace_reset_checksum(void);
  
  /**
   * iotrace_get_checksum() - Get the current checksum value
   *
   * @return currect checksum value
   */
  u32 iotrace_get_checksum(void);
  
  /**
a74440b27   Ramon Fried   iotrace: add IO r...
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
   * iotrace_set_region() - Set whether iotrace is limited to a specific
   * io region.
   *
   * Defines the address and size of the limited region.
   *
   * @start: address of the beginning of the region
   * @size: size of the region in bytes.
   */
  void iotrace_set_region(ulong start, ulong size);
  
  /**
   * iotrace_reset_region() - Reset the region limit
   */
  void iotrace_reset_region(void);
  
  /**
   * iotrace_get_region() - Get region information
   *
   * @start: Returns start address of region
   * @size: Returns size of region in bytes
   */
  void iotrace_get_region(ulong *start, ulong *size);
  
  /**
aa53233a1   Simon Glass   Add an I/O tracin...
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
   * iotrace_set_enabled() - Set whether iotracing is enabled or not
   *
   * This controls whether the checksum is updated and a trace record added
   * for each I/O access.
   *
   * @enable: true to enable iotracing, false to disable
   */
  void iotrace_set_enabled(int enable);
  
  /**
   * iotrace_get_enabled() - Get whether iotracing is enabled or not
   *
   * @return true if enabled, false if disabled
   */
  int iotrace_get_enabled(void);
  
  /**
   * iotrace_set_buffer() - Set position and size of iotrace buffer
   *
   * Defines where the iotrace buffer goes, and resets the output pointer to
   * the start of the buffer.
   *
   * The buffer can be 0 size in which case the checksum is updated but no
   * trace records are writen. If the buffer is exhausted, the offset will
   * continue to increase but not new data will be written.
   *
   * @start: Start address of buffer
   * @size: Size of buffer in bytes
   */
  void iotrace_set_buffer(ulong start, ulong size);
  
  /**
   * iotrace_get_buffer() - Get buffer information
   *
   * @start: Returns start address of buffer
e0212dfa1   Ramon Fried   iotrace: fix beha...
145
146
   * @size: Returns actual size of buffer in bytes
   * @needed_size: Returns needed size of buffer in bytes
aa53233a1   Simon Glass   Add an I/O tracin...
147
148
149
150
   * @offset: Returns the byte offset where the next output trace record will
   * @count: Returns the number of trace records recorded
   * be written (or would be if the buffer was large enough)
   */
e0212dfa1   Ramon Fried   iotrace: fix beha...
151
  void iotrace_get_buffer(ulong *start, ulong *size, ulong *needed_size, ulong *offset, ulong *count);
aa53233a1   Simon Glass   Add an I/O tracin...
152
153
  
  #endif /* __IOTRACE_H */