diff options
author | Russell King <rmk@arm.linux.org.uk> | 2016-01-18 14:30:42 +0000 |
---|---|---|
committer | Russell King <rmk@arm.linux.org.uk> | 2016-01-18 14:30:42 +0000 |
commit | d782ea474e5222d3ee1bee008c68a999a565be96 (patch) | |
tree | c7269a4acaf5ed5cdb813e3ef90f0cb4c172115f /info |
Initial commit
Add sources for etna-gpu-tools
Signed-off-by: Russell King <rmk@arm.linux.org.uk>
Diffstat (limited to 'info')
-rw-r--r-- | info/features.h | 216 | ||||
-rw-r--r-- | info/viv_info.c | 196 |
2 files changed, 412 insertions, 0 deletions
diff --git a/info/features.h b/info/features.h new file mode 100644 index 0000000..c1ef793 --- /dev/null +++ b/info/features.h @@ -0,0 +1,216 @@ +static struct feature vivante_chipFeatures[] __maybe_unused = { +#define FEATURE(x) { chipFeatures_##x, #x } + FEATURE(FAST_CLEAR), + FEATURE(SPECIAL_ANTI_ALIASING), + FEATURE(PIPE_3D), + FEATURE(DXT_TEXTURE_COMPRESSION), + FEATURE(DEBUG_MODE), + FEATURE(Z_COMPRESSION), + FEATURE(YUV420_SCALER), + FEATURE(MSAA), + FEATURE(DC), + FEATURE(PIPE_2D), + FEATURE(ETC1_TEXTURE_COMPRESSION), + FEATURE(FAST_SCALER), + FEATURE(HIGH_DYNAMIC_RANGE), + FEATURE(YUV420_TILER), + FEATURE(MODULE_CG), + FEATURE(MIN_AREA), + FEATURE(NO_EARLY_Z), + FEATURE(NO_422_TEXTURE), + FEATURE(BUFFER_INTERLEAVING), + FEATURE(BYTE_WRITE_2D), + FEATURE(NO_SCALER), + FEATURE(YUY2_AVERAGING), + FEATURE(HALF_PE_CACHE), + FEATURE(HALF_TX_CACHE), + FEATURE(YUY2_RENDER_TARGET), + FEATURE(MEM32), + FEATURE(PIPE_VG), + FEATURE(VGTS), + FEATURE(FE20), + FEATURE(BYTE_WRITE_3D), + FEATURE(RS_YUV_TARGET), + FEATURE(32_BIT_INDICES), +#undef FEATURE +}; +static struct feature vivante_chipMinorFeatures0[] __maybe_unused = { +#define FEATURE(x) { chipMinorFeatures0_##x, #x } + FEATURE(FLIP_Y), + FEATURE(DUAL_RETURN_BUS), + FEATURE(ENDIANNESS_CONFIG), + FEATURE(TEXTURE_8K), + FEATURE(CORRECT_TEXTURE_CONVERTER), + FEATURE(SPECIAL_MSAA_LOD), + FEATURE(FAST_CLEAR_FLUSH), + FEATURE(2DPE20), + FEATURE(CORRECT_AUTO_DISABLE), + FEATURE(RENDERTARGET_8K), + FEATURE(2BITPERTILE), + FEATURE(SEPARATE_TILE_STATUS_WHEN_INTERLEAVED), + FEATURE(SUPER_TILED), + FEATURE(VG_20), + FEATURE(TS_EXTENDED_COMMANDS), + FEATURE(COMPRESSION_FIFO_FIXED), + FEATURE(HAS_SIGN_FLOOR_CEIL), + FEATURE(VG_FILTER), + FEATURE(VG_21), + FEATURE(SHADER_HAS_W), + FEATURE(HAS_SQRT_TRIG), + FEATURE(MORE_MINOR_FEATURES), + FEATURE(MC20), + FEATURE(MSAA_SIDEBAND), + FEATURE(BUG_FIXES0), + FEATURE(VAA), + FEATURE(BYPASS_IN_MSAA), + FEATURE(HZ), + FEATURE(NEW_TEXTURE), + FEATURE(2D_A8_TARGET), + FEATURE(CORRECT_STENCIL), + FEATURE(ENHANCE_VR), +#undef FEATURE +}; +static struct feature vivante_chipMinorFeatures1[] __maybe_unused = { +#define FEATURE(x) { chipMinorFeatures1_##x, #x } + FEATURE(RSUV_SWIZZLE), + FEATURE(V2_COMPRESSION), + FEATURE(VG_DOUBLE_BUFFER), + FEATURE(EXTRA_EVENT_STATES), + FEATURE(NO_STRIPING_NEEDED), + FEATURE(TEXTURE_STRIDE), + FEATURE(BUG_FIXES3), + FEATURE(AUTO_DISABLE), + FEATURE(AUTO_RESTART_TS), + FEATURE(DISABLE_PE_GATING), + FEATURE(L2_WINDOWING), + FEATURE(HALF_FLOAT), + FEATURE(PIXEL_DITHER), + FEATURE(TWO_STENCIL_REFERENCE), + FEATURE(EXTENDED_PIXEL_FORMAT), + FEATURE(CORRECT_MIN_MAX_DEPTH), + FEATURE(2D_DITHER), + FEATURE(BUG_FIXES5), + FEATURE(NEW_2D), + FEATURE(NEW_FP), + FEATURE(TEXTURE_HALIGN), + FEATURE(NON_POWER_OF_TWO), + FEATURE(LINEAR_TEXTURE_SUPPORT), + FEATURE(HALTI0), + FEATURE(CORRECT_OVERFLOW_VG), + FEATURE(NEGATIVE_LOG_FIX), + FEATURE(RESOLVE_OFFSET), + FEATURE(OK_TO_GATE_AXI_CLOCK), + FEATURE(MMU_VERSION), + FEATURE(WIDE_LINE), + FEATURE(BUG_FIXES6), + FEATURE(FC_FLUSH_STALL), +#undef FEATURE +}; +static struct feature vivante_chipMinorFeatures2[] __maybe_unused = { +#define FEATURE(x) { chipMinorFeatures2_##x, #x } + FEATURE(LINE_LOOP), + FEATURE(LOGIC_OP), + FEATURE(UNK2), + FEATURE(SUPERTILED_TEXTURE), + FEATURE(UNK4), + FEATURE(RECT_PRIMITIVE), + FEATURE(COMPOSITION), + FEATURE(CORRECT_AUTO_DISABLE_COUNT), + FEATURE(UNK8), + FEATURE(UNK9), + FEATURE(UNK10), + FEATURE(HALTI1), + FEATURE(UNK12), + FEATURE(UNK13), + FEATURE(UNK14), + FEATURE(EXTRA_TEXTURE_STATE), + FEATURE(FULL_DIRECTFB), + FEATURE(2D_TILING), + FEATURE(THREAD_WALKER_IN_PS), + FEATURE(TILE_FILLER), + FEATURE(UNK20), + FEATURE(2D_MULTI_SOURCE_BLIT), + FEATURE(UNK22), + FEATURE(UNK23), + FEATURE(UNK24), + FEATURE(MIXED_STREAMS), + FEATURE(2D_420_L2CACHE), + FEATURE(UNK27), + FEATURE(2D_NO_INDEX8_BRUSH), + FEATURE(TEXTURE_TILED_READ), + FEATURE(UNK30), + FEATURE(UNK31), +#undef FEATURE +}; +static struct feature vivante_chipMinorFeatures3[] __maybe_unused = { +#define FEATURE(x) { chipMinorFeatures3_##x, #x } + FEATURE(ROTATION_STALL_FIX), + FEATURE(UNK1), + FEATURE(2D_MULTI_SOURCE_BLT_EX), + FEATURE(UNK3), + FEATURE(UNK4), + FEATURE(UNK5), + FEATURE(UNK6), + FEATURE(UNK7), + FEATURE(FAST_MSAA), + FEATURE(UNK9), + FEATURE(BUG_FIXES10), + FEATURE(UNK11), + FEATURE(BUG_FIXES11), + FEATURE(UNK13), + FEATURE(UNK14), + FEATURE(UNK15), + FEATURE(UNK16), + FEATURE(UNK17), + FEATURE(ACE), + FEATURE(UNK19), + FEATURE(UNK20), + FEATURE(UNK21), + FEATURE(UNK22), + FEATURE(UNK23), + FEATURE(UNK24), + FEATURE(UNK25), + FEATURE(NEW_HZ), + FEATURE(UNK27), + FEATURE(UNK28), + FEATURE(UNK29), + FEATURE(UNK30), + FEATURE(UNK31), +#undef FEATURE +}; +static struct feature vivante_chipMinorFeatures4[] __maybe_unused = { +#define FEATURE(x) { chipMinorFeatures4_##x, #x } + FEATURE(UNK0), + FEATURE(UNK1), + FEATURE(UNK2), + FEATURE(UNK3), + FEATURE(UNK4), + FEATURE(UNK5), + FEATURE(UNK6), + FEATURE(UNK7), + FEATURE(UNK8), + FEATURE(UNK9), + FEATURE(UNK10), + FEATURE(UNK11), + FEATURE(UNK12), + FEATURE(UNK13), + FEATURE(UNK14), + FEATURE(UNK15), + FEATURE(HALTI2), + FEATURE(UNK17), + FEATURE(SMALL_MSAA), + FEATURE(UNK19), + FEATURE(UNK20), + FEATURE(UNK21), + FEATURE(UNK22), + FEATURE(UNK23), + FEATURE(UNK24), + FEATURE(UNK25), + FEATURE(UNK26), + FEATURE(UNK27), + FEATURE(UNK28), + FEATURE(UNK29), + FEATURE(UNK30), + FEATURE(UNK31), +#undef FEATURE +}; diff --git a/info/viv_info.c b/info/viv_info.c new file mode 100644 index 0000000..504ddd4 --- /dev/null +++ b/info/viv_info.c @@ -0,0 +1,196 @@ +/* Get info about vivante device */ +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <stdbool.h> +#include <string.h> + +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/ioctl.h> +#include <fcntl.h> +#include <unistd.h> +#include <xf86drm.h> + +#include "etnaviv_drm.h" +#include "hw/common.xml.h" + +#ifdef __GNUC__ +#define __maybe_unused __attribute__((unused)) +#else +#define __maybe_unused +#endif + +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +struct feature { + uint32_t mask; + const char *name; +}; + +#include "features.h" + +static void print_features(uint32_t feature, const struct feature *f, size_t n) +{ + unsigned int i = 0; + while (n--) { + bool flag = feature & f->mask; + printf(" %c %2u:%-32s\n", + flag ? '+' : '-', i, f->name); + f++; + i++; + } + printf("\n"); +} + +struct param { + uint32_t param; + const char *format; + struct feature *tbl; + size_t tbl_sz; + void (*decode)(uint32_t value); +}; + +static struct param params[] = { + { + .param = ETNAVIV_PARAM_GPU_MODEL, + .format = "Chip model: GC%x\n", + }, { + .param = ETNAVIV_PARAM_GPU_REVISION, + .format = "Chip revision: 0x%04x\n", + }, { + .param = ETNAVIV_PARAM_GPU_FEATURES_0, + .format = "Chip features: 0x%08x\n", + .tbl = vivante_chipFeatures, + .tbl_sz = ARRAY_SIZE(vivante_chipFeatures), + }, { + .param = ETNAVIV_PARAM_GPU_FEATURES_1, + .format = "Chip minor features 0: 0x%08x\n", + .tbl = vivante_chipMinorFeatures0, + .tbl_sz = ARRAY_SIZE(vivante_chipMinorFeatures0), + }, { + .param = ETNAVIV_PARAM_GPU_FEATURES_2, + .format = "Chip minor features 1: 0x%08x\n", + .tbl = vivante_chipMinorFeatures1, + .tbl_sz = ARRAY_SIZE(vivante_chipMinorFeatures1), + }, { + .param = ETNAVIV_PARAM_GPU_FEATURES_3, + .format = "Chip minor features 2: 0x%08x\n", + .tbl = vivante_chipMinorFeatures2, + .tbl_sz = ARRAY_SIZE(vivante_chipMinorFeatures2), + }, { + .param = ETNAVIV_PARAM_GPU_FEATURES_4, + .format = "Chip minor features 3: 0x%08x\n", + .tbl = vivante_chipMinorFeatures3, + .tbl_sz = ARRAY_SIZE(vivante_chipMinorFeatures3), + }, { + .param = ETNAVIV_PARAM_GPU_STREAM_COUNT, + .format = "Stream count: %u\n", + }, { + .param = ETNAVIV_PARAM_GPU_REGISTER_MAX, + .format = "Register max: %u\n", + }, { + .param = ETNAVIV_PARAM_GPU_THREAD_COUNT, + .format = "Thread count: %u\n", + }, { + .param = ETNAVIV_PARAM_GPU_SHADER_CORE_COUNT, + .format = "Shader core count: %u\n", + }, { + .param = ETNAVIV_PARAM_GPU_VERTEX_CACHE_SIZE, + .format = "Vertex cache size: %ukB\n", + }, { + .param = ETNAVIV_PARAM_GPU_VERTEX_OUTPUT_BUFFER_SIZE, + .format = "Vertex output buffer size: %u\n", + }, { + .param = ETNAVIV_PARAM_GPU_PIXEL_PIPES, + .format = "Pixel pipes: %u\n", + }, { + .param = ETNAVIV_PARAM_GPU_INSTRUCTION_COUNT, + .format = "Instruction count: %u\n", + }, { + .param = ETNAVIV_PARAM_GPU_NUM_CONSTANTS, + .format = "Num constants: %u\n", + }, { + .param = ETNAVIV_PARAM_GPU_BUFFER_SIZE, + .format = "Buffer size: %u\n", + }, +}; + +static int open_render(void) +{ + drmVersionPtr version; + char buf[64]; + int minor, fd, rc; + + for (minor = 0; minor < 64; minor++) { + snprintf(buf, sizeof(buf), "%s/renderD%d", + DRM_DIR_NAME, 128 + minor); + + fd = open(buf, O_RDWR); + if (fd == -1) + continue; + + version = drmGetVersion(fd); + if (version) { + rc = strcmp(version->name, "etnaviv"); + drmFreeVersion(version); + + if (rc == 0) + return fd; + } + + close(fd); + } + + return -1; +} + +static void show_one_gpu(int fd, int pipe) +{ + struct drm_etnaviv_param req; + int i; + + req.pipe = pipe; + + printf("********** core: %i ***********\n", pipe); + printf("* Chip identity:\n"); + for (i = 0; i < ARRAY_SIZE(params); i++) { + uint32_t val; + + req.param = params[i].param; + if (drmCommandWriteRead(fd, DRM_ETNAVIV_GET_PARAM, &req, sizeof(req))) + continue; + + val = req.value; + + printf(params[i].format, val); + if (params[i].tbl) + print_features(val, params[i].tbl, params[i].tbl_sz); + } + printf("\n"); +} + +int main() +{ + struct drm_etnaviv_param req; + int fd, pipe; + + fd = open_render(); + if (fd == -1) { + perror("Cannot open device"); + exit(1); + } + + for (pipe = 0; pipe < 5; pipe++) { + req.pipe = pipe; + req.param = ETNAVIV_PARAM_GPU_MODEL; + if (drmCommandWriteRead(fd, DRM_ETNAVIV_GET_PARAM, &req, sizeof(req))) + continue; + + show_one_gpu(fd, pipe); + } + + close(fd); + + return 0; +} + |