diff options
author | Jordan Crouse <jcrouse@codeaurora.org> | 2018-07-24 12:33:19 -0400 |
---|---|---|
committer | Rob Clark <robdclark@gmail.com> | 2018-07-30 08:49:02 -0400 |
commit | 489cae632fc04927e8ef36ac8d8847193a41df3b (patch) | |
tree | 86f4e54e3a44eadcc98a7d1edec516ac97536619 | |
parent | 2f2eb723b50b4da887a34570ff15a3c23d966b85 (diff) |
include: Move ascii85 functions from i915 to linux/ascii85.h
The i915 DRM driver very cleverly used ascii85 encoding for their
GPU state file. Move the encode functions to a general header file to
support other drivers that might be interested in the same
functionality.
v4: Make the return value const char * as suggested by Chris Wilson
v3: Fix error_puts -> err_puts pointed out by the 01.org bot
v2: Update API to be cleaner for the caller as suggested by Chris Wilson
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
Signed-off-by: Rob Clark <robdclark@gmail.com>
-rw-r--r-- | drivers/gpu/drm/i915/i915_gpu_error.c | 34 | ||||
-rw-r--r-- | include/linux/ascii85.h | 38 |
2 files changed, 42 insertions, 30 deletions
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c index 8c81cf3aa182..f7f2aa71d8d9 100644 --- a/drivers/gpu/drm/i915/i915_gpu_error.c +++ b/drivers/gpu/drm/i915/i915_gpu_error.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <linux/stop_machine.h> | 31 | #include <linux/stop_machine.h> |
32 | #include <linux/zlib.h> | 32 | #include <linux/zlib.h> |
33 | #include <drm/drm_print.h> | 33 | #include <drm/drm_print.h> |
34 | #include <linux/ascii85.h> | ||
34 | 35 | ||
35 | #include "i915_gpu_error.h" | 36 | #include "i915_gpu_error.h" |
36 | #include "i915_drv.h" | 37 | #include "i915_drv.h" |
@@ -517,35 +518,12 @@ void i915_error_printf(struct drm_i915_error_state_buf *e, const char *f, ...) | |||
517 | va_end(args); | 518 | va_end(args); |
518 | } | 519 | } |
519 | 520 | ||
520 | static int | ||
521 | ascii85_encode_len(int len) | ||
522 | { | ||
523 | return DIV_ROUND_UP(len, 4); | ||
524 | } | ||
525 | |||
526 | static bool | ||
527 | ascii85_encode(u32 in, char *out) | ||
528 | { | ||
529 | int i; | ||
530 | |||
531 | if (in == 0) | ||
532 | return false; | ||
533 | |||
534 | out[5] = '\0'; | ||
535 | for (i = 5; i--; ) { | ||
536 | out[i] = '!' + in % 85; | ||
537 | in /= 85; | ||
538 | } | ||
539 | |||
540 | return true; | ||
541 | } | ||
542 | |||
543 | static void print_error_obj(struct drm_i915_error_state_buf *m, | 521 | static void print_error_obj(struct drm_i915_error_state_buf *m, |
544 | struct intel_engine_cs *engine, | 522 | struct intel_engine_cs *engine, |
545 | const char *name, | 523 | const char *name, |
546 | struct drm_i915_error_object *obj) | 524 | struct drm_i915_error_object *obj) |
547 | { | 525 | { |
548 | char out[6]; | 526 | char out[ASCII85_BUFSZ]; |
549 | int page; | 527 | int page; |
550 | 528 | ||
551 | if (!obj) | 529 | if (!obj) |
@@ -567,12 +545,8 @@ static void print_error_obj(struct drm_i915_error_state_buf *m, | |||
567 | len -= obj->unused; | 545 | len -= obj->unused; |
568 | len = ascii85_encode_len(len); | 546 | len = ascii85_encode_len(len); |
569 | 547 | ||
570 | for (i = 0; i < len; i++) { | 548 | for (i = 0; i < len; i++) |
571 | if (ascii85_encode(obj->pages[page][i], out)) | 549 | err_puts(m, ascii85_encode(obj->pages[page][i], out)); |
572 | err_puts(m, out); | ||
573 | else | ||
574 | err_puts(m, "z"); | ||
575 | } | ||
576 | } | 550 | } |
577 | err_puts(m, "\n"); | 551 | err_puts(m, "\n"); |
578 | } | 552 | } |
diff --git a/include/linux/ascii85.h b/include/linux/ascii85.h new file mode 100644 index 000000000000..4cc40201273e --- /dev/null +++ b/include/linux/ascii85.h | |||
@@ -0,0 +1,38 @@ | |||
1 | /* | ||
2 | * SPDX-License-Identifier: GPL-2.0 | ||
3 | * | ||
4 | * Copyright (c) 2008 Intel Corporation | ||
5 | * Copyright (c) 2018 The Linux Foundation. All rights reserved. | ||
6 | */ | ||
7 | |||
8 | #ifndef _ASCII85_H_ | ||
9 | #define _ASCII85_H_ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | |||
13 | #define ASCII85_BUFSZ 6 | ||
14 | |||
15 | static inline long | ||
16 | ascii85_encode_len(long len) | ||
17 | { | ||
18 | return DIV_ROUND_UP(len, 4); | ||
19 | } | ||
20 | |||
21 | static inline const char * | ||
22 | ascii85_encode(u32 in, char *out) | ||
23 | { | ||
24 | int i; | ||
25 | |||
26 | if (in == 0) | ||
27 | return "z"; | ||
28 | |||
29 | out[5] = '\0'; | ||
30 | for (i = 5; i--; ) { | ||
31 | out[i] = '!' + in % 85; | ||
32 | in /= 85; | ||
33 | } | ||
34 | |||
35 | return out; | ||
36 | } | ||
37 | |||
38 | #endif | ||