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