diff --git a/common/iotrace.c b/common/iotrace.c index b16b0d6..f398856 100644 --- a/common/iotrace.c +++ b/common/iotrace.c @@ -42,6 +42,8 @@ struct iotrace_record { * @start: Start address of iotrace buffer * @size: Size of iotrace buffer in bytes * @offset: Current write offset into iotrace buffer + * @region_start: Address of IO region to trace + * @region_size: Size of region to trace. if 0 will trace all address space * @crc32: Current value of CRC chceksum of trace records * @enabled: true if enabled, false if disabled */ @@ -49,6 +51,8 @@ static struct iotrace { ulong start; ulong size; ulong offset; + ulong region_start; + ulong region_size; u32 crc32; bool enabled; } iotrace; @@ -66,6 +70,11 @@ static void add_record(int flags, const void *ptr, ulong value) if (!(gd->flags & GD_FLG_RELOC) || !iotrace.enabled) return; + if (iotrace.region_size) + if ((ulong)ptr < iotrace.region_start || + (ulong)ptr > iotrace.region_start + iotrace.region_size) + return; + /* Store it if there is room */ if (iotrace.offset + sizeof(*rec) < iotrace.size) { rec = (struct iotrace_record *)map_sysmem( @@ -142,6 +151,24 @@ u32 iotrace_get_checksum(void) return iotrace.crc32; } +void iotrace_set_region(ulong start, ulong size) +{ + iotrace.region_start = start; + iotrace.region_size = size; +} + +void iotrace_reset_region(void) +{ + iotrace.region_start = 0; + iotrace.region_size = 0; +} + +void iotrace_get_region(ulong *start, ulong *size) +{ + *start = iotrace.region_start; + *size = iotrace.region_size; +} + void iotrace_set_enabled(int enable) { iotrace.enabled = enable; diff --git a/include/iotrace.h b/include/iotrace.h index 9fe5733..1efb117 100644 --- a/include/iotrace.h +++ b/include/iotrace.h @@ -59,6 +59,30 @@ void iotrace_reset_checksum(void); u32 iotrace_get_checksum(void); /** + * 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); + +/** * iotrace_set_enabled() - Set whether iotracing is enabled or not * * This controls whether the checksum is updated and a trace record added