[i-g-t 15/27] tests/i915/vm_bind: Add i915_error_decode library routines
Bhanuprakash Modem
bhanuprakash.modem at intel.com
Mon Jan 23 09:43:23 UTC 2023
From: Niranjana Vishwanathapura <niranjana.vishwanathapura at intel.com>
In preparation of i915_vm_bind_capture test, move some common
error decode routines to library for code sharing.
v2: Change library name from i915_capture to i915_error_decode
and use library routines in tools/intel_error_decode.c
Reviewed-by: Matthew Auld <matthew.auld at intel.com>
Signed-off-by: Niranjana Vishwanathapura <niranjana.vishwanathapura at intel.com>
---
lib/i915/i915_error_decode.c | 111 ++++++++++++++++++++++++++++++++++
lib/i915/i915_error_decode.h | 14 +++++
lib/meson.build | 1 +
tests/i915/gem_exec_capture.c | 90 +--------------------------
tools/intel_error_decode.c | 88 +--------------------------
5 files changed, 130 insertions(+), 174 deletions(-)
create mode 100644 lib/i915/i915_error_decode.c
create mode 100644 lib/i915/i915_error_decode.h
diff --git a/lib/i915/i915_error_decode.c b/lib/i915/i915_error_decode.c
new file mode 100644
index 00000000..c3687cc9
--- /dev/null
+++ b/lib/i915/i915_error_decode.c
@@ -0,0 +1,111 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2022 Intel Corporation
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <zlib.h>
+
+#include "i915_error_decode.h"
+
+static unsigned long zlib_inflate(uint32_t **ptr, unsigned long len)
+{
+ struct z_stream_s zstream;
+ void *out;
+
+ memset(&zstream, 0, sizeof(zstream));
+
+ zstream.next_in = (unsigned char *)*ptr;
+ zstream.avail_in = 4*len;
+
+ if (inflateInit(&zstream) != Z_OK)
+ return 0;
+
+ out = malloc(128*4096); /* approximate obj size */
+ zstream.next_out = out;
+ zstream.avail_out = 128*4096;
+
+ do {
+ switch (inflate(&zstream, Z_SYNC_FLUSH)) {
+ case Z_STREAM_END:
+ goto end;
+ case Z_OK:
+ break;
+ default:
+ inflateEnd(&zstream);
+ return 0;
+ }
+
+ if (zstream.avail_out)
+ break;
+
+ out = realloc(out, 2*zstream.total_out);
+ if (out == NULL) {
+ inflateEnd(&zstream);
+ return 0;
+ }
+
+ zstream.next_out = (unsigned char *)out + zstream.total_out;
+ zstream.avail_out = zstream.total_out;
+ } while (1);
+end:
+ inflateEnd(&zstream);
+ free(*ptr);
+ *ptr = out;
+ return zstream.total_out / 4;
+}
+
+/**
+ * i915_ascii85_decode: Ascii85 decode error string
+ * @in: input error string
+ * @out: output decoded string
+ * @inflate: needs zlib inflate
+ * @end: ouput end of decoded @in string
+ *
+ * Parse and decode @in string and return the decoded string in @out.
+ * Inflate (decompress) out string if @inflate is true. Return decoded
+ * end marker in @end if specified.
+ *
+ * Returns: Length of output decoded string.
+ *
+ **/
+unsigned long
+i915_ascii85_decode(char *in, uint32_t **out, bool inflate, char **end)
+{
+ unsigned long len = 0, size = 1024;
+
+ *out = realloc(*out, sizeof(uint32_t)*size);
+ if (*out == NULL)
+ return 0;
+
+ while (*in >= '!' && *in <= 'z') {
+ uint32_t v = 0;
+
+ if (len == size) {
+ size *= 2;
+ *out = realloc(*out, sizeof(uint32_t)*size);
+ if (*out == NULL)
+ return 0;
+ }
+
+ if (*in == 'z') {
+ in++;
+ } else {
+ v += in[0] - 33; v *= 85;
+ v += in[1] - 33; v *= 85;
+ v += in[2] - 33; v *= 85;
+ v += in[3] - 33; v *= 85;
+ v += in[4] - 33;
+ in += 5;
+ }
+ (*out)[len++] = v;
+ }
+ if (end)
+ *end = in;
+
+ if (!inflate)
+ return len;
+
+ return zlib_inflate(out, len);
+}
diff --git a/lib/i915/i915_error_decode.h b/lib/i915/i915_error_decode.h
new file mode 100644
index 00000000..204e32a3
--- /dev/null
+++ b/lib/i915/i915_error_decode.h
@@ -0,0 +1,14 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2022 Intel Corporation
+ */
+#ifndef _I915_ERROR_DECODE_H_
+#define _I915_ERROR_DECODE_H_
+
+#include <stdbool.h>
+#include <stdint.h>
+
+unsigned long
+i915_ascii85_decode(char *in, uint32_t **out, bool inflate, char **end);
+
+#endif /* _I915_ERROR_DECODE_H_ */
diff --git a/lib/meson.build b/lib/meson.build
index ce7adf46..02e31309 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -15,6 +15,7 @@ lib_sources = [
'i915/intel_memory_region.c',
'i915/intel_mocs.c',
'i915/i915_blt.c',
+ 'i915/i915_error_decode.c',
'i915/i915_crc.c',
'i915/i915_vm_bind.c',
'igt_collection.c',
diff --git a/tests/i915/gem_exec_capture.c b/tests/i915/gem_exec_capture.c
index 2db58266..51d9e2fb 100644
--- a/tests/i915/gem_exec_capture.c
+++ b/tests/i915/gem_exec_capture.c
@@ -22,10 +22,10 @@
*/
#include <sys/poll.h>
-#include <zlib.h>
#include <sched.h>
#include "i915/gem.h"
+#include "i915/i915_error_decode.h"
#include "i915/gem_create.h"
#include "igt.h"
#include "igt_device.h"
@@ -42,92 +42,6 @@ struct offset {
bool found;
};
-static unsigned long zlib_inflate(uint32_t **ptr, unsigned long len)
-{
- struct z_stream_s zstream;
- void *out;
-
- memset(&zstream, 0, sizeof(zstream));
-
- zstream.next_in = (unsigned char *)*ptr;
- zstream.avail_in = 4*len;
-
- if (inflateInit(&zstream) != Z_OK)
- return 0;
-
- out = malloc(128*4096); /* approximate obj size */
- zstream.next_out = out;
- zstream.avail_out = 128*4096;
-
- do {
- switch (inflate(&zstream, Z_SYNC_FLUSH)) {
- case Z_STREAM_END:
- goto end;
- case Z_OK:
- break;
- default:
- inflateEnd(&zstream);
- return 0;
- }
-
- if (zstream.avail_out)
- break;
-
- out = realloc(out, 2*zstream.total_out);
- if (out == NULL) {
- inflateEnd(&zstream);
- return 0;
- }
-
- zstream.next_out = (unsigned char *)out + zstream.total_out;
- zstream.avail_out = zstream.total_out;
- } while (1);
-end:
- inflateEnd(&zstream);
- free(*ptr);
- *ptr = out;
- return zstream.total_out / 4;
-}
-
-static unsigned long
-ascii85_decode(char *in, uint32_t **out, bool inflate, char **end)
-{
- unsigned long len = 0, size = 1024;
-
- *out = realloc(*out, sizeof(uint32_t)*size);
- if (*out == NULL)
- return 0;
-
- while (*in >= '!' && *in <= 'z') {
- uint32_t v = 0;
-
- if (len == size) {
- size *= 2;
- *out = realloc(*out, sizeof(uint32_t)*size);
- if (*out == NULL)
- return 0;
- }
-
- if (*in == 'z') {
- in++;
- } else {
- v += in[0] - 33; v *= 85;
- v += in[1] - 33; v *= 85;
- v += in[2] - 33; v *= 85;
- v += in[3] - 33; v *= 85;
- v += in[4] - 33;
- in += 5;
- }
- (*out)[len++] = v;
- }
- *end = in;
-
- if (!inflate)
- return len;
-
- return zlib_inflate(out, len);
-}
-
static int check_error_state(int dir, struct offset *obj_offsets, int obj_count,
uint64_t obj_size, bool incremental)
{
@@ -184,7 +98,7 @@ static int check_error_state(int dir, struct offset *obj_offsets, int obj_count,
continue;
igt_debug("blob:%.64s\n", str);
- sz = ascii85_decode(str + 1, &data, *str == ':', &str);
+ sz = i915_ascii85_decode(str + 1, &data, *str == ':', &str);
igt_assert_eq(4 * sz, obj_size);
igt_assert(*str++ == '\n');
diff --git a/tools/intel_error_decode.c b/tools/intel_error_decode.c
index 99680bed..a9da7ec9 100644
--- a/tools/intel_error_decode.c
+++ b/tools/intel_error_decode.c
@@ -49,7 +49,6 @@
#include <sys/stat.h>
#include <err.h>
#include <assert.h>
-#include <zlib.h>
#include <ctype.h>
#include "intel_chipset.h"
@@ -58,6 +57,7 @@
#include "intel_reg.h"
#include "drmtest.h"
#include "i915/intel_decode.h"
+#include "i915/i915_error_decode.h"
static uint32_t
print_head(unsigned int reg)
@@ -479,90 +479,6 @@ static void decode(struct intel_decode *ctx,
*count = 0;
}
-static int zlib_inflate(uint32_t **ptr, int len)
-{
- struct z_stream_s zstream;
- void *out;
-
- memset(&zstream, 0, sizeof(zstream));
-
- zstream.next_in = (unsigned char *)*ptr;
- zstream.avail_in = 4*len;
-
- if (inflateInit(&zstream) != Z_OK)
- return 0;
-
- out = malloc(128*4096); /* approximate obj size */
- zstream.next_out = out;
- zstream.avail_out = 128*4096;
-
- do {
- switch (inflate(&zstream, Z_SYNC_FLUSH)) {
- case Z_STREAM_END:
- goto end;
- case Z_OK:
- break;
- default:
- inflateEnd(&zstream);
- return 0;
- }
-
- if (zstream.avail_out)
- break;
-
- out = realloc(out, 2*zstream.total_out);
- if (out == NULL) {
- inflateEnd(&zstream);
- return 0;
- }
-
- zstream.next_out = (unsigned char *)out + zstream.total_out;
- zstream.avail_out = zstream.total_out;
- } while (1);
-end:
- inflateEnd(&zstream);
- free(*ptr);
- *ptr = out;
- return zstream.total_out / 4;
-}
-
-static int ascii85_decode(const char *in, uint32_t **out, bool inflate)
-{
- int len = 0, size = 1024;
-
- *out = realloc(*out, sizeof(uint32_t)*size);
- if (*out == NULL)
- return 0;
-
- while (*in >= '!' && *in <= 'z') {
- uint32_t v = 0;
-
- if (len == size) {
- size *= 2;
- *out = realloc(*out, sizeof(uint32_t)*size);
- if (*out == NULL)
- return 0;
- }
-
- if (*in == 'z') {
- in++;
- } else {
- v += in[0] - 33; v *= 85;
- v += in[1] - 33; v *= 85;
- v += in[2] - 33; v *= 85;
- v += in[3] - 33; v *= 85;
- v += in[4] - 33;
- in += 5;
- }
- (*out)[len++] = v;
- }
-
- if (!inflate)
- return len;
-
- return zlib_inflate(out, len);
-}
-
static void
read_data_file(FILE *file)
{
@@ -587,7 +503,7 @@ read_data_file(FILE *file)
char *dashes;
if (line[0] == ':' || line[0] == '~') {
- count = ascii85_decode(line+1, &data, line[0] == ':');
+ count = i915_ascii85_decode(line+1, &data, line[0] == ':', NULL);
if (count == 0)
fprintf(stderr, "ASCII85 decode failed (%s - %s).\n",
ring_name, buffer_name);
--
2.39.0
More information about the Intel-gfx-trybot
mailing list