xref: /linux/drivers/gpu/drm/xe/xe_guc_log.h (revision c17ee635fd3a482b2ad2bf5e269755c2eae5f25e)
1 /* SPDX-License-Identifier: MIT */
2 /*
3  * Copyright © 2022 Intel Corporation
4  */
5 
6 #ifndef _XE_GUC_LOG_H_
7 #define _XE_GUC_LOG_H_
8 
9 #include "xe_guc_log_types.h"
10 #include "abi/guc_log_abi.h"
11 
12 struct drm_printer;
13 struct xe_device;
14 
15 #if IS_ENABLED(CONFIG_DRM_XE_DEBUG_GUC)
16 #define XE_GUC_LOG_EVENT_DATA_BUFFER_SIZE	SZ_8M
17 #define XE_GUC_LOG_CRASH_DUMP_BUFFER_SIZE	SZ_1M
18 #define XE_GUC_LOG_STATE_CAPTURE_BUFFER_SIZE	SZ_2M
19 #else
20 #define XE_GUC_LOG_EVENT_DATA_BUFFER_SIZE	SZ_64K
21 #define XE_GUC_LOG_CRASH_DUMP_BUFFER_SIZE	SZ_16K
22 #define XE_GUC_LOG_STATE_CAPTURE_BUFFER_SIZE	SZ_1M
23 #endif
24 
25 #define GUC_LOG_SIZE (SZ_4K + \
26 		      XE_GUC_LOG_EVENT_DATA_BUFFER_SIZE + \
27 		      XE_GUC_LOG_CRASH_DUMP_BUFFER_SIZE + \
28 		      XE_GUC_LOG_STATE_CAPTURE_BUFFER_SIZE)
29 
30 #define XE_GUC_LOG_EVENT_DATA_OFFSET	SZ_4K
31 #define XE_GUC_LOG_CRASH_DUMP_OFFSET	(XE_GUC_LOG_EVENT_DATA_OFFSET + \
32 					 XE_GUC_LOG_EVENT_DATA_BUFFER_SIZE)
33 #define XE_GUC_LOG_STATE_CAPTURE_OFFSET	(XE_GUC_LOG_CRASH_DUMP_OFFSET + \
34 					 XE_GUC_LOG_CRASH_DUMP_BUFFER_SIZE)
35 
36 /*
37  * While we're using plain log level in i915, GuC controls are much more...
38  * "elaborate"? We have a couple of bits for verbosity, separate bit for actual
39  * log enabling, and separate bit for default logging - which "conveniently"
40  * ignores the enable bit.
41  */
42 #define GUC_LOG_LEVEL_DISABLED		0
43 #define GUC_LOG_LEVEL_NON_VERBOSE	1
44 #define GUC_LOG_LEVEL_IS_ENABLED(x)	((x) > GUC_LOG_LEVEL_DISABLED)
45 #define GUC_LOG_LEVEL_IS_VERBOSE(x)	((x) > GUC_LOG_LEVEL_NON_VERBOSE)
46 #define GUC_LOG_LEVEL_TO_VERBOSITY(x) ({		\
47 	typeof(x) _x = (x);				\
48 	GUC_LOG_LEVEL_IS_VERBOSE(_x) ? _x - 2 : 0;	\
49 })
50 #define GUC_VERBOSITY_TO_LOG_LEVEL(x)	((x) + 2)
51 #define GUC_LOG_LEVEL_MAX GUC_VERBOSITY_TO_LOG_LEVEL(GUC_LOG_VERBOSITY_MAX)
52 
53 int xe_guc_log_init(struct xe_guc_log *log);
54 void xe_guc_log_print(struct xe_guc_log *log, struct drm_printer *p);
55 void xe_guc_log_print_lfd(struct xe_guc_log *log, struct drm_printer *p);
56 void xe_guc_log_print_dmesg(struct xe_guc_log *log);
57 struct xe_guc_log_snapshot *xe_guc_log_snapshot_capture(struct xe_guc_log *log, bool atomic);
58 void xe_guc_log_snapshot_print(struct xe_guc_log_snapshot *snapshot, struct drm_printer *p);
59 void xe_guc_log_snapshot_free(struct xe_guc_log_snapshot *snapshot);
60 
61 static inline u32
62 xe_guc_log_get_level(struct xe_guc_log *log)
63 {
64 	return log->level;
65 }
66 
67 bool xe_guc_check_log_buf_overflow(struct xe_guc_log *log,
68 				   enum guc_log_type type,
69 				   unsigned int full_cnt);
70 
71 #endif
72