1 | /* |
2 | * Copyright © 2014 Intel Corporation |
3 | * |
4 | * Permission is hereby granted, free of charge, to any person obtaining a |
5 | * copy of this software and associated documentation files (the |
6 | * "Software"), to deal in the Software without restriction, including |
7 | * without limitation the rights to use, copy, modify, merge, publish, |
8 | * distribute, sub license, and/or sell copies of the Software, and to |
9 | * permit persons to whom the Software is furnished to do so, subject to |
10 | * the following conditions: |
11 | * |
12 | * The above copyright notice and this permission notice (including the |
13 | * next paragraph) shall be included in all copies or substantial portions |
14 | * of the Software. |
15 | * |
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
19 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
21 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS |
22 | * IN THE SOFTWARE. |
23 | */ |
24 | |
25 | #include <linux/string_helpers.h> |
26 | |
27 | #include <drm/drm_print.h> |
28 | |
29 | #include "i915_params.h" |
30 | #include "i915_drv.h" |
31 | |
32 | DECLARE_DYNDBG_CLASSMAP(drm_debug_classes, DD_CLASS_TYPE_DISJOINT_BITS, 0, |
33 | "DRM_UT_CORE" , |
34 | "DRM_UT_DRIVER" , |
35 | "DRM_UT_KMS" , |
36 | "DRM_UT_PRIME" , |
37 | "DRM_UT_ATOMIC" , |
38 | "DRM_UT_VBL" , |
39 | "DRM_UT_STATE" , |
40 | "DRM_UT_LEASE" , |
41 | "DRM_UT_DP" , |
42 | "DRM_UT_DRMRES" ); |
43 | |
44 | #define i915_param_named(name, T, perm, desc) \ |
45 | module_param_named(name, i915_modparams.name, T, perm); \ |
46 | MODULE_PARM_DESC(name, desc) |
47 | #define i915_param_named_unsafe(name, T, perm, desc) \ |
48 | module_param_named_unsafe(name, i915_modparams.name, T, perm); \ |
49 | MODULE_PARM_DESC(name, desc) |
50 | |
51 | struct i915_params i915_modparams __read_mostly = { |
52 | #define MEMBER(T, member, value, ...) .member = (value), |
53 | I915_PARAMS_FOR_EACH(MEMBER) |
54 | #undef MEMBER |
55 | }; |
56 | |
57 | /* |
58 | * Note: As a rule, keep module parameter sysfs permissions read-only |
59 | * 0400. Runtime changes are only supported through i915 debugfs. |
60 | * |
61 | * For any exceptions requiring write access and runtime changes through module |
62 | * parameter sysfs, prevent debugfs file creation by setting the parameter's |
63 | * debugfs mode to 0. |
64 | */ |
65 | |
66 | i915_param_named(modeset, int, 0400, |
67 | "Use kernel modesetting [KMS] (0=disable, " |
68 | "1=on, -1=force vga console preference [default])" ); |
69 | |
70 | i915_param_named_unsafe(reset, uint, 0400, |
71 | "Attempt GPU resets (0=disabled, 1=full gpu reset, 2=engine reset [default])" ); |
72 | |
73 | #if IS_ENABLED(CONFIG_DRM_I915_CAPTURE_ERROR) |
74 | i915_param_named(error_capture, bool, 0400, |
75 | "Record the GPU state following a hang. " |
76 | "This information in /sys/class/drm/card<N>/error is vital for " |
77 | "triaging and debugging hangs." ); |
78 | #endif |
79 | |
80 | i915_param_named_unsafe(enable_hangcheck, bool, 0400, |
81 | "Periodically check GPU activity for detecting hangs. " |
82 | "WARNING: Disabling this can cause system wide hangs. " |
83 | "(default: true)" ); |
84 | |
85 | i915_param_named_unsafe(force_probe, charp, 0400, |
86 | "Force probe options for specified supported devices. " |
87 | "See CONFIG_DRM_I915_FORCE_PROBE for details." ); |
88 | |
89 | i915_param_named(memtest, bool, 0400, |
90 | "Perform a read/write test of all device memory on module load (default: off)" ); |
91 | |
92 | i915_param_named(mmio_debug, int, 0400, |
93 | "Enable the MMIO debug code for the first N failures (default: off). " |
94 | "This may negatively affect performance." ); |
95 | |
96 | i915_param_named_unsafe(enable_guc, int, 0400, |
97 | "Enable GuC load for GuC submission and/or HuC load. " |
98 | "Required functionality can be selected using bitmask values. " |
99 | "(-1=auto [default], 0=disable, 1=GuC submission, 2=HuC load)" ); |
100 | |
101 | i915_param_named(guc_log_level, int, 0400, |
102 | "GuC firmware logging level. Requires GuC to be loaded. " |
103 | "(-1=auto [default], 0=disable, 1..4=enable with verbosity min..max)" ); |
104 | |
105 | i915_param_named_unsafe(guc_firmware_path, charp, 0400, |
106 | "GuC firmware path to use instead of the default one" ); |
107 | |
108 | i915_param_named_unsafe(huc_firmware_path, charp, 0400, |
109 | "HuC firmware path to use instead of the default one" ); |
110 | |
111 | i915_param_named_unsafe(dmc_firmware_path, charp, 0400, |
112 | "DMC firmware path to use instead of the default one" ); |
113 | |
114 | i915_param_named_unsafe(gsc_firmware_path, charp, 0400, |
115 | "GSC firmware path to use instead of the default one" ); |
116 | |
117 | #if IS_ENABLED(CONFIG_DRM_I915_DEBUG) |
118 | i915_param_named_unsafe(inject_probe_failure, uint, 0400, |
119 | "Force an error after a number of failure check points (0:disabled (default), N:force failure at the Nth failure check point)" ); |
120 | #endif |
121 | |
122 | #if IS_ENABLED(CONFIG_DRM_I915_GVT) |
123 | i915_param_named(enable_gvt, bool, 0400, |
124 | "Enable support for Intel GVT-g graphics virtualization host support(default:false)" ); |
125 | #endif |
126 | |
127 | #if CONFIG_DRM_I915_REQUEST_TIMEOUT |
128 | i915_param_named_unsafe(request_timeout_ms, uint, 0600, |
129 | "Default request/fence/batch buffer expiration timeout." ); |
130 | #endif |
131 | |
132 | i915_param_named_unsafe(lmem_size, uint, 0400, |
133 | "Set the lmem size(in MiB) for each region. (default: 0, all memory)" ); |
134 | i915_param_named_unsafe(lmem_bar_size, uint, 0400, |
135 | "Set the lmem bar size(in MiB)." ); |
136 | |
137 | static void _param_print_bool(struct drm_printer *p, const char *name, |
138 | bool val) |
139 | { |
140 | drm_printf(p, f: "i915.%s=%s\n" , name, str_yes_no(v: val)); |
141 | } |
142 | |
143 | static void _param_print_int(struct drm_printer *p, const char *name, |
144 | int val) |
145 | { |
146 | drm_printf(p, f: "i915.%s=%d\n" , name, val); |
147 | } |
148 | |
149 | static void _param_print_uint(struct drm_printer *p, const char *name, |
150 | unsigned int val) |
151 | { |
152 | drm_printf(p, f: "i915.%s=%u\n" , name, val); |
153 | } |
154 | |
155 | static void _param_print_ulong(struct drm_printer *p, const char *name, |
156 | unsigned long val) |
157 | { |
158 | drm_printf(p, f: "i915.%s=%lu\n" , name, val); |
159 | } |
160 | |
161 | static void _param_print_charp(struct drm_printer *p, const char *name, |
162 | const char *val) |
163 | { |
164 | drm_printf(p, f: "i915.%s=%s\n" , name, val); |
165 | } |
166 | |
167 | #define _param_print(p, name, val) \ |
168 | _Generic(val, \ |
169 | bool: _param_print_bool, \ |
170 | int: _param_print_int, \ |
171 | unsigned int: _param_print_uint, \ |
172 | unsigned long: _param_print_ulong, \ |
173 | char *: _param_print_charp)(p, name, val) |
174 | |
175 | /** |
176 | * i915_params_dump - dump i915 modparams |
177 | * @params: i915 modparams |
178 | * @p: the &drm_printer |
179 | * |
180 | * Pretty printer for i915 modparams. |
181 | */ |
182 | void i915_params_dump(const struct i915_params *params, struct drm_printer *p) |
183 | { |
184 | #define PRINT(T, x, ...) _param_print(p, #x, params->x); |
185 | I915_PARAMS_FOR_EACH(PRINT); |
186 | #undef PRINT |
187 | } |
188 | |
189 | static void _param_dup_charp(char **valp) |
190 | { |
191 | *valp = kstrdup(s: *valp, GFP_ATOMIC); |
192 | } |
193 | |
194 | static void _param_nop(void *valp) |
195 | { |
196 | } |
197 | |
198 | #define _param_dup(valp) \ |
199 | _Generic(valp, \ |
200 | char **: _param_dup_charp, \ |
201 | default: _param_nop)(valp) |
202 | |
203 | void i915_params_copy(struct i915_params *dest, const struct i915_params *src) |
204 | { |
205 | *dest = *src; |
206 | #define DUP(T, x, ...) _param_dup(&dest->x); |
207 | I915_PARAMS_FOR_EACH(DUP); |
208 | #undef DUP |
209 | } |
210 | |
211 | static void _param_free_charp(char **valp) |
212 | { |
213 | kfree(objp: *valp); |
214 | *valp = NULL; |
215 | } |
216 | |
217 | #define _param_free(valp) \ |
218 | _Generic(valp, \ |
219 | char **: _param_free_charp, \ |
220 | default: _param_nop)(valp) |
221 | |
222 | /* free the allocated members, *not* the passed in params itself */ |
223 | void i915_params_free(struct i915_params *params) |
224 | { |
225 | #define FREE(T, x, ...) _param_free(¶ms->x); |
226 | I915_PARAMS_FOR_EACH(FREE); |
227 | #undef FREE |
228 | } |
229 | |