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