xref: /linux/drivers/gpu/drm/xe/xe_guc_log.h (revision 53597deca0e38c30e6cd4ba2114fa42d2bcd85bb)
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_16M
17 #define XE_GUC_LOG_CRASH_DUMP_BUFFER_SIZE	SZ_1M
18 #define XE_GUC_LOG_STATE_CAPTURE_BUFFER_SIZE	SZ_2M
19 #elif IS_ENABLED(CONFIG_DRM_XE_DEBUG)
20 #define XE_GUC_LOG_EVENT_DATA_BUFFER_SIZE	SZ_8M
21 #define XE_GUC_LOG_CRASH_DUMP_BUFFER_SIZE	SZ_1M
22 #define XE_GUC_LOG_STATE_CAPTURE_BUFFER_SIZE	SZ_1M
23 #else
24 #define XE_GUC_LOG_EVENT_DATA_BUFFER_SIZE	SZ_64K
25 #define XE_GUC_LOG_CRASH_DUMP_BUFFER_SIZE	SZ_16K
26 #define XE_GUC_LOG_STATE_CAPTURE_BUFFER_SIZE	SZ_1M
27 #endif
28 
29 #define GUC_LOG_SIZE (SZ_4K + \
30 		      XE_GUC_LOG_EVENT_DATA_BUFFER_SIZE + \
31 		      XE_GUC_LOG_CRASH_DUMP_BUFFER_SIZE + \
32 		      XE_GUC_LOG_STATE_CAPTURE_BUFFER_SIZE)
33 
34 #define XE_GUC_LOG_EVENT_DATA_OFFSET	SZ_4K
35 #define XE_GUC_LOG_CRASH_DUMP_OFFSET	(XE_GUC_LOG_EVENT_DATA_OFFSET + \
36 					 XE_GUC_LOG_EVENT_DATA_BUFFER_SIZE)
37 #define XE_GUC_LOG_STATE_CAPTURE_OFFSET	(XE_GUC_LOG_CRASH_DUMP_OFFSET + \
38 					 XE_GUC_LOG_CRASH_DUMP_BUFFER_SIZE)
39 
40 /*
41  * While we're using plain log level in i915, GuC controls are much more...
42  * "elaborate"? We have a couple of bits for verbosity, separate bit for actual
43  * log enabling, and separate bit for default logging - which "conveniently"
44  * ignores the enable bit.
45  */
46 #define GUC_LOG_LEVEL_DISABLED		0
47 #define GUC_LOG_LEVEL_NON_VERBOSE	1
48 #define GUC_LOG_LEVEL_IS_ENABLED(x)	((x) > GUC_LOG_LEVEL_DISABLED)
49 #define GUC_LOG_LEVEL_IS_VERBOSE(x)	((x) > GUC_LOG_LEVEL_NON_VERBOSE)
50 #define GUC_LOG_LEVEL_TO_VERBOSITY(x) ({		\
51 	typeof(x) _x = (x);				\
52 	GUC_LOG_LEVEL_IS_VERBOSE(_x) ? _x - 2 : 0;	\
53 })
54 #define GUC_VERBOSITY_TO_LOG_LEVEL(x)	((x) + 2)
55 #define GUC_LOG_LEVEL_MAX GUC_VERBOSITY_TO_LOG_LEVEL(GUC_LOG_VERBOSITY_MAX)
56 
57 int xe_guc_log_init(struct xe_guc_log *log);
58 void xe_guc_log_print(struct xe_guc_log *log, struct drm_printer *p);
59 void xe_guc_log_print_lfd(struct xe_guc_log *log, struct drm_printer *p);
60 void xe_guc_log_print_dmesg(struct xe_guc_log *log);
61 struct xe_guc_log_snapshot *xe_guc_log_snapshot_capture(struct xe_guc_log *log, bool atomic);
62 void xe_guc_log_snapshot_print(struct xe_guc_log_snapshot *snapshot, struct drm_printer *p);
63 void xe_guc_log_snapshot_free(struct xe_guc_log_snapshot *snapshot);
64 
65 static inline u32
66 xe_guc_log_get_level(struct xe_guc_log *log)
67 {
68 	return log->level;
69 }
70 
71 bool xe_guc_check_log_buf_overflow(struct xe_guc_log *log,
72 				   enum guc_log_type type,
73 				   unsigned int full_cnt);
74 
75 #endif
76