xref: /linux/include/linux/mmiotrace.h (revision 8b7d89d02ef3c6a7c73d6596f28cea7632850af4)
1*8b7d89d0SPekka Paalanen #ifndef MMIOTRACE_H
2*8b7d89d0SPekka Paalanen #define MMIOTRACE_H
3*8b7d89d0SPekka Paalanen 
4*8b7d89d0SPekka Paalanen #include <asm/types.h>
5*8b7d89d0SPekka Paalanen 
6*8b7d89d0SPekka Paalanen #define MMIO_VERSION 0x04
7*8b7d89d0SPekka Paalanen 
8*8b7d89d0SPekka Paalanen /* mm_io_header.type */
9*8b7d89d0SPekka Paalanen #define MMIO_OPCODE_MASK 0xff
10*8b7d89d0SPekka Paalanen #define MMIO_OPCODE_SHIFT 0
11*8b7d89d0SPekka Paalanen #define MMIO_WIDTH_MASK 0xff00
12*8b7d89d0SPekka Paalanen #define MMIO_WIDTH_SHIFT 8
13*8b7d89d0SPekka Paalanen #define MMIO_MAGIC (0x6f000000 | (MMIO_VERSION<<16))
14*8b7d89d0SPekka Paalanen #define MMIO_MAGIC_MASK 0xffff0000
15*8b7d89d0SPekka Paalanen 
16*8b7d89d0SPekka Paalanen enum mm_io_opcode {          /* payload type: */
17*8b7d89d0SPekka Paalanen 	MMIO_READ = 0x1,     /* struct mm_io_rw */
18*8b7d89d0SPekka Paalanen 	MMIO_WRITE = 0x2,    /* struct mm_io_rw */
19*8b7d89d0SPekka Paalanen 	MMIO_PROBE = 0x3,    /* struct mm_io_map */
20*8b7d89d0SPekka Paalanen 	MMIO_UNPROBE = 0x4,  /* struct mm_io_map */
21*8b7d89d0SPekka Paalanen 	MMIO_MARKER = 0x5,   /* raw char data */
22*8b7d89d0SPekka Paalanen 	MMIO_UNKNOWN_OP = 0x6, /* struct mm_io_rw */
23*8b7d89d0SPekka Paalanen };
24*8b7d89d0SPekka Paalanen 
25*8b7d89d0SPekka Paalanen struct mm_io_header {
26*8b7d89d0SPekka Paalanen 	__u32 type;
27*8b7d89d0SPekka Paalanen 	__u32 sec;      /* timestamp */
28*8b7d89d0SPekka Paalanen 	__u32 nsec;
29*8b7d89d0SPekka Paalanen 	__u32 pid;      /* PID of the process, or 0 for kernel core */
30*8b7d89d0SPekka Paalanen 	__u16 data_len; /* length of the following payload */
31*8b7d89d0SPekka Paalanen };
32*8b7d89d0SPekka Paalanen 
33*8b7d89d0SPekka Paalanen struct mm_io_rw {
34*8b7d89d0SPekka Paalanen 	__u64 address; /* virtual address of register */
35*8b7d89d0SPekka Paalanen 	__u64 value;
36*8b7d89d0SPekka Paalanen 	__u64 pc;      /* optional program counter */
37*8b7d89d0SPekka Paalanen };
38*8b7d89d0SPekka Paalanen 
39*8b7d89d0SPekka Paalanen struct mm_io_map {
40*8b7d89d0SPekka Paalanen 	__u64 phys;  /* base address in PCI space */
41*8b7d89d0SPekka Paalanen 	__u64 addr;  /* base virtual address */
42*8b7d89d0SPekka Paalanen 	__u64 len;   /* mapping size */
43*8b7d89d0SPekka Paalanen 	__u64 pc;    /* optional program counter */
44*8b7d89d0SPekka Paalanen };
45*8b7d89d0SPekka Paalanen 
46*8b7d89d0SPekka Paalanen 
47*8b7d89d0SPekka Paalanen /*
48*8b7d89d0SPekka Paalanen  * These structures are used to allow a single relay_write()
49*8b7d89d0SPekka Paalanen  * call to write a full packet.
50*8b7d89d0SPekka Paalanen  */
51*8b7d89d0SPekka Paalanen 
52*8b7d89d0SPekka Paalanen struct mm_io_header_rw {
53*8b7d89d0SPekka Paalanen 	struct mm_io_header header;
54*8b7d89d0SPekka Paalanen 	struct mm_io_rw rw;
55*8b7d89d0SPekka Paalanen } __attribute__((packed));
56*8b7d89d0SPekka Paalanen 
57*8b7d89d0SPekka Paalanen struct mm_io_header_map {
58*8b7d89d0SPekka Paalanen 	struct mm_io_header header;
59*8b7d89d0SPekka Paalanen 	struct mm_io_map map;
60*8b7d89d0SPekka Paalanen } __attribute__((packed));
61*8b7d89d0SPekka Paalanen 
62*8b7d89d0SPekka Paalanen #endif /* MMIOTRACE_H */
63