This will be used later on by the ring/ib decoder library API that is coming. Signed-off-by: Tom St Denis <tom.stdenis at amd.com> --- src/app/ring_read.c | 24 ++++---------------- src/lib/CMakeLists.txt | 1 + src/lib/umr_read_ring_data.c | 53 ++++++++++++++++++++++++++++++++++++++++++++ src/umr.h | 1 + 4 files changed, 59 insertions(+), 20 deletions(-) create mode 100644 src/lib/umr_read_ring_data.c diff --git a/src/app/ring_read.c b/src/app/ring_read.c index 112e9f0414ad..e3ffd4aab277 100644 --- a/src/app/ring_read.c +++ b/src/app/ring_read.c @@ -27,8 +27,8 @@ void umr_read_ring(struct umr_asic *asic, char *ringpath) { - char fname[128], ringname[32], from[32], to[32]; - int fd, use_decoder, enable_decoder; + char ringname[32], from[32], to[32]; + int use_decoder, enable_decoder; uint32_t wptr, rptr, drv_wptr, ringsize, start, end, value, *ring_data; struct umr_ring_decoder decoder, *pdecoder, *ppdecoder; @@ -42,13 +42,6 @@ void umr_read_ring(struct umr_asic *asic, char *ringpath) return; } - snprintf(fname, sizeof(fname)-1, "/sys/kernel/debug/dri/%d/amdgpu_ring_%s", asic->instance, ringname); - fd = open(fname, O_RDWR); - if (fd < 0) { - perror("Could not open ring debugfs file"); - return; - } - // only decode PM4 packets on certain rings memset(&decoder, 0, sizeof decoder); if (!memcmp(ringname, "gfx", 3) || @@ -69,18 +62,9 @@ void umr_read_ring(struct umr_asic *asic, char *ringpath) if (asic->options.halt_waves) umr_sq_cmd_halt_waves(asic, UMR_SQ_CMD_HALT); - /* determine file size */ - ringsize = lseek(fd, 0, SEEK_END) - 12; - lseek(fd, 0, SEEK_SET); - - ring_data = calloc(1, ringsize + 12); - if (!ring_data) { - close(fd); - perror("Could not allocate ring data"); + ring_data = umr_read_ring_data(asic, ringname, &ringsize); + if (!ring_data) goto end; - } - read(fd, ring_data, ringsize + 12); - close(fd); /* read pointers */ rptr = ring_data[0]<<2; diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index fc87ab725370..7a04540b58c8 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -27,6 +27,7 @@ add_library(umrcore STATIC wave_status.c umr_apply_bank_address.c umr_llvm_disasm.c + umr_read_ring_data.c update.c version.c $<TARGET_OBJECTS:asic> $<TARGET_OBJECTS:ip> diff --git a/src/lib/umr_read_ring_data.c b/src/lib/umr_read_ring_data.c new file mode 100644 index 000000000000..cbdeab5f1d7b --- /dev/null +++ b/src/lib/umr_read_ring_data.c @@ -0,0 +1,53 @@ +/* + * Copyright 2018 Advanced Micro Devices, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: Tom St Denis <tom.stdenis at amd.com> + * + */ +#include "umr.h" + +void *umr_read_ring_data(struct umr_asic *asic, char *ringname, uint32_t *ringsize) +{ + int fd; + void *ring_data; + char fname[128]; + + snprintf(fname, sizeof(fname)-1, "/sys/kernel/debug/dri/%d/amdgpu_ring_%s", asic->instance, ringname); + fd = open(fname, O_RDWR); + if (fd < 0) { + fprintf(stderr, "[ERROR]: Could not open ring debugfs file"); + return NULL; + } + + /* determine file size */ + *ringsize = lseek(fd, 0, SEEK_END) - 12; + lseek(fd, 0, SEEK_SET); + + ring_data = calloc(1, *ringsize + 12); + if (!ring_data) { + close(fd); + fprintf(stderr, "[ERROR]: Out of memory\n"); + return NULL; + } + read(fd, ring_data, *ringsize + 12); + close(fd); + return ring_data; +} diff --git a/src/umr.h b/src/umr.h index e4ae645cea62..290824b271f1 100644 --- a/src/umr.h +++ b/src/umr.h @@ -620,6 +620,7 @@ int umr_grbm_select_index(struct umr_asic *asic, uint32_t se, uint32_t sh, uint3 int umr_sq_cmd_halt_waves(struct umr_asic *asic, enum umr_sq_cmd_halt_resume mode); /* IB/ring decoding/dumping/etc */ +void *umr_read_ring_data(struct umr_asic *asic, char *ringname, uint32_t *ringsize); void umr_print_decode(struct umr_asic *asic, struct umr_ring_decoder *decoder, uint32_t ib); void umr_dump_ib(struct umr_asic *asic, struct umr_ring_decoder *decoder); void umr_dump_shaders(struct umr_asic *asic, struct umr_ring_decoder *decoder, struct umr_wave_data *wd); -- 2.14.3