183d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */ 2aa53233aSSimon Glass /* 3aa53233aSSimon Glass * Copyright (c) 2014 Google, Inc. 4aa53233aSSimon Glass */ 5aa53233aSSimon Glass 6aa53233aSSimon Glass #ifndef __IOTRACE_H 7aa53233aSSimon Glass #define __IOTRACE_H 8aa53233aSSimon Glass 97e9be3eaSRamon Fried //#include <common.h> 10aa53233aSSimon Glass #include <linux/types.h> 11aa53233aSSimon Glass 127e9be3eaSRamon Fried /* Support up to the machine word length for now */ 137e9be3eaSRamon Fried typedef ulong iovalue_t; 147e9be3eaSRamon Fried 157e9be3eaSRamon Fried enum iotrace_flags { 167e9be3eaSRamon Fried IOT_8 = 0, 177e9be3eaSRamon Fried IOT_16, 187e9be3eaSRamon Fried IOT_32, 197e9be3eaSRamon Fried 207e9be3eaSRamon Fried IOT_READ = 0 << 3, 217e9be3eaSRamon Fried IOT_WRITE = 1 << 3, 227e9be3eaSRamon Fried }; 237e9be3eaSRamon Fried 247e9be3eaSRamon Fried /** 257e9be3eaSRamon Fried * struct iotrace_record - Holds a single I/O trace record 267e9be3eaSRamon Fried * 277e9be3eaSRamon Fried * @flags: I/O access type 287e9be3eaSRamon Fried * @timestamp: Timestamp of access 297e9be3eaSRamon Fried * @addr: Address of access 307e9be3eaSRamon Fried * @value: Value written or read 317e9be3eaSRamon Fried */ 327e9be3eaSRamon Fried struct iotrace_record { 337e9be3eaSRamon Fried enum iotrace_flags flags; 347e9be3eaSRamon Fried u64 timestamp; 357e9be3eaSRamon Fried phys_addr_t addr; 367e9be3eaSRamon Fried iovalue_t value; 377e9be3eaSRamon Fried }; 387e9be3eaSRamon Fried 39aa53233aSSimon Glass /* 40aa53233aSSimon Glass * This file is designed to be included in arch/<arch>/include/asm/io.h. 41aa53233aSSimon Glass * It redirects all IO access through a tracing/checksumming feature for 42aa53233aSSimon Glass * testing purposes. 43aa53233aSSimon Glass */ 44aa53233aSSimon Glass 45aa53233aSSimon Glass #if defined(CONFIG_IO_TRACE) && !defined(IOTRACE_IMPL) && \ 46aa53233aSSimon Glass !defined(CONFIG_SPL_BUILD) 47aa53233aSSimon Glass 48aa53233aSSimon Glass #undef readl 49aa53233aSSimon Glass #define readl(addr) iotrace_readl((const void *)(addr)) 50aa53233aSSimon Glass 51aa53233aSSimon Glass #undef writel 52aa53233aSSimon Glass #define writel(val, addr) iotrace_writel(val, (const void *)(addr)) 53aa53233aSSimon Glass 54aa53233aSSimon Glass #undef readw 55aa53233aSSimon Glass #define readw(addr) iotrace_readw((const void *)(addr)) 56aa53233aSSimon Glass 57aa53233aSSimon Glass #undef writew 58aa53233aSSimon Glass #define writew(val, addr) iotrace_writew(val, (const void *)(addr)) 59aa53233aSSimon Glass 60aa53233aSSimon Glass #undef readb 61709e98b7SSimon Glass #define readb(addr) iotrace_readb((const void *)(uintptr_t)addr) 62aa53233aSSimon Glass 63aa53233aSSimon Glass #undef writeb 64709e98b7SSimon Glass #define writeb(val, addr) \ 65709e98b7SSimon Glass iotrace_writeb(val, (const void *)(uintptr_t)addr) 66aa53233aSSimon Glass 67aa53233aSSimon Glass #endif 68aa53233aSSimon Glass 69aa53233aSSimon Glass /* Tracing functions which mirror their io.h counterparts */ 70aa53233aSSimon Glass u32 iotrace_readl(const void *ptr); 71aa53233aSSimon Glass void iotrace_writel(ulong value, const void *ptr); 72aa53233aSSimon Glass u16 iotrace_readw(const void *ptr); 73aa53233aSSimon Glass void iotrace_writew(ulong value, const void *ptr); 74aa53233aSSimon Glass u8 iotrace_readb(const void *ptr); 75aa53233aSSimon Glass void iotrace_writeb(ulong value, const void *ptr); 76aa53233aSSimon Glass 77aa53233aSSimon Glass /** 78aa53233aSSimon Glass * iotrace_reset_checksum() - Reset the iotrace checksum 79aa53233aSSimon Glass */ 80aa53233aSSimon Glass void iotrace_reset_checksum(void); 81aa53233aSSimon Glass 82aa53233aSSimon Glass /** 83aa53233aSSimon Glass * iotrace_get_checksum() - Get the current checksum value 84aa53233aSSimon Glass * 85aa53233aSSimon Glass * @return currect checksum value 86aa53233aSSimon Glass */ 87aa53233aSSimon Glass u32 iotrace_get_checksum(void); 88aa53233aSSimon Glass 89aa53233aSSimon Glass /** 90a74440b2SRamon Fried * iotrace_set_region() - Set whether iotrace is limited to a specific 91a74440b2SRamon Fried * io region. 92a74440b2SRamon Fried * 93a74440b2SRamon Fried * Defines the address and size of the limited region. 94a74440b2SRamon Fried * 95a74440b2SRamon Fried * @start: address of the beginning of the region 96a74440b2SRamon Fried * @size: size of the region in bytes. 97a74440b2SRamon Fried */ 98a74440b2SRamon Fried void iotrace_set_region(ulong start, ulong size); 99a74440b2SRamon Fried 100a74440b2SRamon Fried /** 101a74440b2SRamon Fried * iotrace_reset_region() - Reset the region limit 102a74440b2SRamon Fried */ 103a74440b2SRamon Fried void iotrace_reset_region(void); 104a74440b2SRamon Fried 105a74440b2SRamon Fried /** 106a74440b2SRamon Fried * iotrace_get_region() - Get region information 107a74440b2SRamon Fried * 108a74440b2SRamon Fried * @start: Returns start address of region 109a74440b2SRamon Fried * @size: Returns size of region in bytes 110a74440b2SRamon Fried */ 111a74440b2SRamon Fried void iotrace_get_region(ulong *start, ulong *size); 112a74440b2SRamon Fried 113a74440b2SRamon Fried /** 114aa53233aSSimon Glass * iotrace_set_enabled() - Set whether iotracing is enabled or not 115aa53233aSSimon Glass * 116aa53233aSSimon Glass * This controls whether the checksum is updated and a trace record added 117aa53233aSSimon Glass * for each I/O access. 118aa53233aSSimon Glass * 119aa53233aSSimon Glass * @enable: true to enable iotracing, false to disable 120aa53233aSSimon Glass */ 121aa53233aSSimon Glass void iotrace_set_enabled(int enable); 122aa53233aSSimon Glass 123aa53233aSSimon Glass /** 124aa53233aSSimon Glass * iotrace_get_enabled() - Get whether iotracing is enabled or not 125aa53233aSSimon Glass * 126aa53233aSSimon Glass * @return true if enabled, false if disabled 127aa53233aSSimon Glass */ 128aa53233aSSimon Glass int iotrace_get_enabled(void); 129aa53233aSSimon Glass 130aa53233aSSimon Glass /** 131aa53233aSSimon Glass * iotrace_set_buffer() - Set position and size of iotrace buffer 132aa53233aSSimon Glass * 133aa53233aSSimon Glass * Defines where the iotrace buffer goes, and resets the output pointer to 134aa53233aSSimon Glass * the start of the buffer. 135aa53233aSSimon Glass * 136aa53233aSSimon Glass * The buffer can be 0 size in which case the checksum is updated but no 137aa53233aSSimon Glass * trace records are writen. If the buffer is exhausted, the offset will 138aa53233aSSimon Glass * continue to increase but not new data will be written. 139aa53233aSSimon Glass * 140aa53233aSSimon Glass * @start: Start address of buffer 141aa53233aSSimon Glass * @size: Size of buffer in bytes 142aa53233aSSimon Glass */ 143aa53233aSSimon Glass void iotrace_set_buffer(ulong start, ulong size); 144aa53233aSSimon Glass 145aa53233aSSimon Glass /** 146aa53233aSSimon Glass * iotrace_get_buffer() - Get buffer information 147aa53233aSSimon Glass * 148aa53233aSSimon Glass * @start: Returns start address of buffer 149*e0212dfaSRamon Fried * @size: Returns actual size of buffer in bytes 150*e0212dfaSRamon Fried * @needed_size: Returns needed size of buffer in bytes 151aa53233aSSimon Glass * @offset: Returns the byte offset where the next output trace record will 152aa53233aSSimon Glass * @count: Returns the number of trace records recorded 153aa53233aSSimon Glass * be written (or would be if the buffer was large enough) 154aa53233aSSimon Glass */ 155*e0212dfaSRamon Fried void iotrace_get_buffer(ulong *start, ulong *size, ulong *needed_size, ulong *offset, ulong *count); 156aa53233aSSimon Glass 157aa53233aSSimon Glass #endif /* __IOTRACE_H */ 158