summaryrefslogtreecommitdiff
path: root/info
diff options
context:
space:
mode:
authorRussell King <rmk@arm.linux.org.uk>2016-01-18 14:30:42 +0000
committerRussell King <rmk@arm.linux.org.uk>2016-01-18 14:30:42 +0000
commitd782ea474e5222d3ee1bee008c68a999a565be96 (patch)
treec7269a4acaf5ed5cdb813e3ef90f0cb4c172115f /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.h216
-rw-r--r--info/viv_info.c196
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;
+}
+