From patchwork Fri Jun 16 13:46:45 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michal Wajdeczko X-Patchwork-Id: 9791711 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 62FAD60325 for ; Fri, 16 Jun 2017 13:47:05 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 61FA428644 for ; Fri, 16 Jun 2017 13:47:05 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5659128648; Fri, 16 Jun 2017 13:47:05 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id D25B528644 for ; Fri, 16 Jun 2017 13:47:03 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 8C0C06E8EF; Fri, 16 Jun 2017 13:47:01 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by gabe.freedesktop.org (Postfix) with ESMTPS id 37BEB6E8EA for ; Fri, 16 Jun 2017 13:46:58 +0000 (UTC) Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 16 Jun 2017 06:46:57 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos; i="5.39,347,1493708400"; d="scan'208"; a="1141953088" Received: from irvmail001.ir.intel.com ([163.33.26.43]) by orsmga001.jf.intel.com with ESMTP; 16 Jun 2017 06:46:55 -0700 Received: from mwajdecz-MOBL1.ger.corp.intel.com (mwajdecz-mobl1.ger.corp.intel.com [172.28.174.25]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id v5GDkor0029958; Fri, 16 Jun 2017 14:46:55 +0100 From: Michal Wajdeczko To: intel-gfx@lists.freedesktop.org Date: Fri, 16 Jun 2017 13:46:45 +0000 Message-Id: <20170616134647.21424-3-michal.wajdeczko@intel.com> X-Mailer: git-send-email 2.10.1.windows.1 In-Reply-To: <20170616134647.21424-1-michal.wajdeczko@intel.com> References: <20170616134647.21424-1-michal.wajdeczko@intel.com> Cc: Jani Nikula , Daniel Vetter Subject: [Intel-gfx] [PATCH v4 2/4] drm/i915: Extend PARAMS_FOR_EACH macro with more data X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Virus-Scanned: ClamAV using ClamSMTP Currently our PARAMS_FOR_EACH macro contains only param type and name. We use this macro to define struct members, but later on we initialize this struct using handcrafted code, which leads in some cases to use mismatched value vs. type. Let's extend our root macro with param default value to keep them in sync. Also drop ; from the macro to allow more flexible usages. v2: Add unsafe tag (Chris) Add all other data to allow complete automation (Michal) As we now have all data in the param macro, we can automatically add 'default' info to the description and avoid any mismatches. v3: Fix printing default value in the description (Michal) v4: s/func/param and reorder items (Chris) v5: Use lowercase names in macro (Jani) Signed-off-by: Michal Wajdeczko Cc: Chris Wilson Cc: Jani Nikula Cc: Daniel Vetter --- drivers/gpu/drm/i915/i915_debugfs.c | 6 +- drivers/gpu/drm/i915/i915_gpu_error.c | 10 +- drivers/gpu/drm/i915/i915_params.c | 236 ++-------------------------------- drivers/gpu/drm/i915/i915_params.h | 182 +++++++++++++++++++------- 4 files changed, 158 insertions(+), 276 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index a6ba210..9fbba1e 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c @@ -44,9 +44,9 @@ static __always_inline void seq_print_param(struct seq_file *m, seq_printf(m, "i915.%s=%s\n", name, yesno(*(const bool *)x)); else if (!__builtin_strcmp(type, "int")) seq_printf(m, "i915.%s=%d\n", name, *(const int *)x); - else if (!__builtin_strcmp(type, "unsigned int")) + else if (!__builtin_strcmp(type, "uint")) seq_printf(m, "i915.%s=%u\n", name, *(const unsigned int *)x); - else if (!__builtin_strcmp(type, "char *")) + else if (!__builtin_strcmp(type, "charp")) seq_printf(m, "i915.%s=%s\n", name, *(const char **)x); else BUILD_BUG(); @@ -66,7 +66,7 @@ static int i915_capabilities(struct seq_file *m, void *data) #undef PRINT_FLAG kernel_param_lock(THIS_MODULE); -#define PRINT_PARAM(T, x) seq_print_param(m, #x, #T, &i915.x); +#define PRINT_PARAM(X, T, V, U, M, B, D) seq_print_param(m, #X, #T, &i915.X); I915_PARAMS_FOR_EACH(PRINT_PARAM); #undef PRINT_PARAM kernel_param_unlock(THIS_MODULE); diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c index e18f350..000f733 100644 --- a/drivers/gpu/drm/i915/i915_gpu_error.c +++ b/drivers/gpu/drm/i915/i915_gpu_error.c @@ -555,9 +555,9 @@ static __always_inline void err_print_param(struct drm_i915_error_state_buf *m, err_printf(m, "i915.%s=%s\n", name, yesno(*(const bool *)x)); else if (!__builtin_strcmp(type, "int")) err_printf(m, "i915.%s=%d\n", name, *(const int *)x); - else if (!__builtin_strcmp(type, "unsigned int")) + else if (!__builtin_strcmp(type, "uint")) err_printf(m, "i915.%s=%u\n", name, *(const unsigned int *)x); - else if (!__builtin_strcmp(type, "char *")) + else if (!__builtin_strcmp(type, "charp")) err_printf(m, "i915.%s=%s\n", name, *(const char **)x); else BUILD_BUG(); @@ -566,7 +566,7 @@ static __always_inline void err_print_param(struct drm_i915_error_state_buf *m, static void err_print_params(struct drm_i915_error_state_buf *m, const struct i915_params *p) { -#define PRINT(T, x) err_print_param(m, #x, #T, &p->x); +#define PRINT(X, T, V, U, M, B, D) err_print_param(m, #X, #T, &p->X); I915_PARAMS_FOR_EACH(PRINT); #undef PRINT } @@ -860,7 +860,7 @@ void __i915_gpu_state_free(struct kref *error_ref) kfree(error->overlay); kfree(error->display); -#define FREE(T, x) free_param(#T, &error->params.x); +#define FREE(X, T, V, U, M, B, D) free_param(#T, &error->params.X); I915_PARAMS_FOR_EACH(FREE); #undef FREE @@ -1694,7 +1694,7 @@ static int capture(void *data) error->i915->gt.last_init_time)); error->params = i915; -#define DUP(T, x) dup_param(#T, &error->params.x); +#define DUP(X, T, V, U, M, B, D) dup_param(#T, &error->params.X); I915_PARAMS_FOR_EACH(DUP); #undef DUP diff --git a/drivers/gpu/drm/i915/i915_params.c b/drivers/gpu/drm/i915/i915_params.c index 6c27d33..40e6142 100644 --- a/drivers/gpu/drm/i915/i915_params.c +++ b/drivers/gpu/drm/i915/i915_params.c @@ -26,230 +26,16 @@ #include "i915_drv.h" struct i915_params i915 __read_mostly = { - .modeset = -1, - .panel_ignore_lid = 1, - .semaphores = -1, - .lvds_channel_mode = 0, - .panel_use_ssc = -1, - .vbt_sdvo_panel_type = -1, - .enable_rc6 = -1, - .enable_dc = -1, - .enable_fbc = -1, - .enable_execlists = -1, - .enable_hangcheck = true, - .enable_ppgtt = -1, - .enable_psr = -1, - .alpha_support = IS_ENABLED(CONFIG_DRM_I915_ALPHA_SUPPORT), - .disable_power_well = -1, - .enable_ips = 1, - .fastboot = 0, - .prefault_disable = 0, - .load_detect_test = 0, - .force_reset_modeset_test = 0, - .reset = true, - .error_capture = true, - .invert_brightness = 0, - .disable_display = 0, - .enable_cmd_parser = true, - .use_mmio_flip = 0, - .mmio_debug = 0, - .verbose_state_checks = 1, - .nuclear_pageflip = 0, - .edp_vswing = 0, - .enable_guc_loading = 0, - .enable_guc_submission = 0, - .guc_log_level = -1, - .guc_firmware_path = NULL, - .huc_firmware_path = NULL, - .enable_dp_mst = true, - .inject_load_failure = 0, - .enable_dpcd_backlight = false, - .enable_gvt = false, +#define MEMBER(name, type, value, unsafe, mode, brief, detailed) .name = value, + I915_PARAMS_FOR_EACH(MEMBER) +#undef MEMBER }; -module_param_named(modeset, i915.modeset, int, 0400); -MODULE_PARM_DESC(modeset, - "Use kernel modesetting [KMS] (0=disable, " - "1=on, -1=force vga console preference [default])"); - -module_param_named_unsafe(panel_ignore_lid, i915.panel_ignore_lid, int, 0600); -MODULE_PARM_DESC(panel_ignore_lid, - "Override lid status (0=autodetect, 1=autodetect disabled [default], " - "-1=force lid closed, -2=force lid open)"); - -module_param_named_unsafe(semaphores, i915.semaphores, int, 0400); -MODULE_PARM_DESC(semaphores, - "Use semaphores for inter-ring sync " - "(default: -1 (use per-chip defaults))"); - -module_param_named_unsafe(enable_rc6, i915.enable_rc6, int, 0400); -MODULE_PARM_DESC(enable_rc6, - "Enable power-saving render C-state 6. " - "Different stages can be selected via bitmask values " - "(0 = disable; 1 = enable rc6; 2 = enable deep rc6; 4 = enable deepest rc6). " - "For example, 3 would enable rc6 and deep rc6, and 7 would enable everything. " - "default: -1 (use per-chip default)"); - -module_param_named_unsafe(enable_dc, i915.enable_dc, int, 0400); -MODULE_PARM_DESC(enable_dc, - "Enable power-saving display C-states. " - "(-1=auto [default]; 0=disable; 1=up to DC5; 2=up to DC6)"); - -module_param_named_unsafe(enable_fbc, i915.enable_fbc, int, 0600); -MODULE_PARM_DESC(enable_fbc, - "Enable frame buffer compression for power savings " - "(default: -1 (use per-chip default))"); - -module_param_named_unsafe(lvds_channel_mode, i915.lvds_channel_mode, int, 0400); -MODULE_PARM_DESC(lvds_channel_mode, - "Specify LVDS channel mode " - "(0=probe BIOS [default], 1=single-channel, 2=dual-channel)"); - -module_param_named_unsafe(panel_use_ssc, i915.panel_use_ssc, int, 0600); -MODULE_PARM_DESC(panel_use_ssc, - "Use Spread Spectrum Clock with panels [LVDS/eDP] " - "(default: auto from VBT)"); - -module_param_named_unsafe(vbt_sdvo_panel_type, i915.vbt_sdvo_panel_type, int, 0400); -MODULE_PARM_DESC(vbt_sdvo_panel_type, - "Override/Ignore selection of SDVO panel mode in the VBT " - "(-2=ignore, -1=auto [default], index in VBT BIOS table)"); - -module_param_named_unsafe(reset, i915.reset, bool, 0600); -MODULE_PARM_DESC(reset, "Attempt GPU resets (default: true)"); - -#if IS_ENABLED(CONFIG_DRM_I915_CAPTURE_ERROR) -module_param_named(error_capture, i915.error_capture, bool, 0600); -MODULE_PARM_DESC(error_capture, - "Record the GPU state following a hang. " - "This information in /sys/class/drm/card/error is vital for " - "triaging and debugging hangs."); -#endif - -module_param_named_unsafe(enable_hangcheck, i915.enable_hangcheck, bool, 0644); -MODULE_PARM_DESC(enable_hangcheck, - "Periodically check GPU activity for detecting hangs. " - "WARNING: Disabling this can cause system wide hangs. " - "(default: true)"); - -module_param_named_unsafe(enable_ppgtt, i915.enable_ppgtt, int, 0400); -MODULE_PARM_DESC(enable_ppgtt, - "Override PPGTT usage. " - "(-1=auto [default], 0=disabled, 1=aliasing, 2=full, 3=full with extended address space)"); - -module_param_named_unsafe(enable_execlists, i915.enable_execlists, int, 0400); -MODULE_PARM_DESC(enable_execlists, - "Override execlists usage. " - "(-1=auto [default], 0=disabled, 1=enabled)"); - -module_param_named_unsafe(enable_psr, i915.enable_psr, int, 0600); -MODULE_PARM_DESC(enable_psr, "Enable PSR " - "(0=disabled, 1=enabled - link mode chosen per-platform, 2=force link-standby mode, 3=force link-off mode) " - "Default: -1 (use per-chip default)"); - -module_param_named_unsafe(alpha_support, i915.alpha_support, bool, 0400); -MODULE_PARM_DESC(alpha_support, - "Enable alpha quality driver support for latest hardware. " - "See also CONFIG_DRM_I915_ALPHA_SUPPORT."); - -module_param_named_unsafe(disable_power_well, i915.disable_power_well, int, 0400); -MODULE_PARM_DESC(disable_power_well, - "Disable display power wells when possible " - "(-1=auto [default], 0=power wells always on, 1=power wells disabled when possible)"); - -module_param_named_unsafe(enable_ips, i915.enable_ips, int, 0600); -MODULE_PARM_DESC(enable_ips, "Enable IPS (default: true)"); - -module_param_named(fastboot, i915.fastboot, bool, 0600); -MODULE_PARM_DESC(fastboot, - "Try to skip unnecessary mode sets at boot time (default: false)"); - -module_param_named_unsafe(prefault_disable, i915.prefault_disable, bool, 0600); -MODULE_PARM_DESC(prefault_disable, - "Disable page prefaulting for pread/pwrite/reloc (default:false). " - "For developers only."); - -module_param_named_unsafe(load_detect_test, i915.load_detect_test, bool, 0600); -MODULE_PARM_DESC(load_detect_test, - "Force-enable the VGA load detect code for testing (default:false). " - "For developers only."); - -module_param_named_unsafe(force_reset_modeset_test, i915.force_reset_modeset_test, bool, 0600); -MODULE_PARM_DESC(force_reset_modeset_test, - "Force a modeset during gpu reset for testing (default:false). " - "For developers only."); - -module_param_named_unsafe(invert_brightness, i915.invert_brightness, int, 0600); -MODULE_PARM_DESC(invert_brightness, - "Invert backlight brightness " - "(-1 force normal, 0 machine defaults, 1 force inversion), please " - "report PCI device ID, subsystem vendor and subsystem device ID " - "to dri-devel@lists.freedesktop.org, if your machine needs it. " - "It will then be included in an upcoming module version."); - -module_param_named(disable_display, i915.disable_display, bool, 0400); -MODULE_PARM_DESC(disable_display, "Disable display (default: false)"); - -module_param_named_unsafe(enable_cmd_parser, i915.enable_cmd_parser, bool, 0400); -MODULE_PARM_DESC(enable_cmd_parser, - "Enable command parsing (true=enabled [default], false=disabled)"); - -module_param_named_unsafe(use_mmio_flip, i915.use_mmio_flip, int, 0600); -MODULE_PARM_DESC(use_mmio_flip, - "use MMIO flips (-1=never, 0=driver discretion [default], 1=always)"); - -module_param_named(mmio_debug, i915.mmio_debug, int, 0600); -MODULE_PARM_DESC(mmio_debug, - "Enable the MMIO debug code for the first N failures (default: off). " - "This may negatively affect performance."); - -module_param_named(verbose_state_checks, i915.verbose_state_checks, bool, 0600); -MODULE_PARM_DESC(verbose_state_checks, - "Enable verbose logs (ie. WARN_ON()) in case of unexpected hw state conditions."); - -module_param_named_unsafe(nuclear_pageflip, i915.nuclear_pageflip, bool, 0400); -MODULE_PARM_DESC(nuclear_pageflip, - "Force enable atomic functionality on platforms that don't have full support yet."); - -/* WA to get away with the default setting in VBT for early platforms.Will be removed */ -module_param_named_unsafe(edp_vswing, i915.edp_vswing, int, 0400); -MODULE_PARM_DESC(edp_vswing, - "Ignore/Override vswing pre-emph table selection from VBT " - "(0=use value from vbt [default], 1=low power swing(200mV)," - "2=default swing(400mV))"); - -module_param_named_unsafe(enable_guc_loading, i915.enable_guc_loading, int, 0400); -MODULE_PARM_DESC(enable_guc_loading, - "Enable GuC firmware loading " - "(-1=auto, 0=never [default], 1=if available, 2=required)"); - -module_param_named_unsafe(enable_guc_submission, i915.enable_guc_submission, int, 0400); -MODULE_PARM_DESC(enable_guc_submission, - "Enable GuC submission " - "(-1=auto, 0=never [default], 1=if available, 2=required)"); - -module_param_named(guc_log_level, i915.guc_log_level, int, 0400); -MODULE_PARM_DESC(guc_log_level, - "GuC firmware logging level (-1:disabled (default), 0-3:enabled)"); - -module_param_named_unsafe(guc_firmware_path, i915.guc_firmware_path, charp, 0400); -MODULE_PARM_DESC(guc_firmware_path, - "GuC firmware path to use instead of the default one"); - -module_param_named_unsafe(huc_firmware_path, i915.huc_firmware_path, charp, 0400); -MODULE_PARM_DESC(huc_firmware_path, - "HuC firmware path to use instead of the default one"); - -module_param_named_unsafe(enable_dp_mst, i915.enable_dp_mst, bool, 0600); -MODULE_PARM_DESC(enable_dp_mst, - "Enable multi-stream transport (MST) for new DisplayPort sinks. (default: true)"); -module_param_named_unsafe(inject_load_failure, i915.inject_load_failure, uint, 0400); -MODULE_PARM_DESC(inject_load_failure, - "Force an error after a number of failure check points (0:disabled (default), N:force failure at the Nth failure check point)"); -module_param_named(enable_dpcd_backlight, i915.enable_dpcd_backlight, bool, 0600); -MODULE_PARM_DESC(enable_dpcd_backlight, - "Enable support for DPCD backlight control (default:false)"); - -module_param_named(enable_gvt, i915.enable_gvt, bool, 0400); -MODULE_PARM_DESC(enable_gvt, - "Enable support for Intel GVT-g graphics virtualization host support(default:false)"); +#undef NULL /* we don't want to see (void*)0 in the description */ +#define NULL "" +#define PARAM(name, type, value, unsafe, mode, brief, detailed) \ + module_param_named##unsafe(name, i915.name, type, mode); \ + MODULE_PARM_DESC(name, brief " " detailed "[default: " __stringify(value) "]"); +I915_PARAMS_FOR_EACH(PARAM) +#undef PARAM +#undef NULL diff --git a/drivers/gpu/drm/i915/i915_params.h b/drivers/gpu/drm/i915/i915_params.h index 34148cc..6cc7c3b 100644 --- a/drivers/gpu/drm/i915/i915_params.h +++ b/drivers/gpu/drm/i915/i915_params.h @@ -27,55 +27,151 @@ #include /* for __read_mostly */ -#define I915_PARAMS_FOR_EACH(func) \ - func(int, modeset); \ - func(int, panel_ignore_lid); \ - func(int, semaphores); \ - func(int, lvds_channel_mode); \ - func(int, panel_use_ssc); \ - func(int, vbt_sdvo_panel_type); \ - func(int, enable_rc6); \ - func(int, enable_dc); \ - func(int, enable_fbc); \ - func(int, enable_ppgtt); \ - func(int, enable_execlists); \ - func(int, enable_psr); \ - func(int, disable_power_well); \ - func(int, enable_ips); \ - func(int, invert_brightness); \ - func(int, enable_guc_loading); \ - func(int, enable_guc_submission); \ - func(int, guc_log_level); \ - func(char *, guc_firmware_path); \ - func(char *, huc_firmware_path); \ - func(int, use_mmio_flip); \ - func(int, mmio_debug); \ - func(int, edp_vswing); \ - func(unsigned int, inject_load_failure); \ +/* + * Each i915 module param is defined as single 'param' entry: + * param(name, type, value, unsafe, mode, brief, detailed) + * where: + * @name: the name of param + * @type: int|uint|bool|charp + * @value: the default value of the param + * @unsafe: must be either empty or _unsafe + * @mode: the access mode (usually 0600|0400) + * @brief: short description text of the param + * @detailed: more detailed description of the param (may be empty) + */ +#define _I915_PARAMS_FOR_EACH_BASE(param) \ + param(modeset, int, -1, /*safe*/, 0400, \ + "Use kernel modesetting (KMS).", \ + "(0=disable, 1=on, -1=force vga console preference)") \ + param(panel_ignore_lid, int, 1, _unsafe, 0600, \ + "Override lid status.", \ + "(0=autodetect, 1=autodetect disabled, -1=force lid closed, -2=force lid open)") \ + param(semaphores, int, -1, _unsafe, 0400, \ + "Use semaphores for inter-ring sync.", \ + "(-1=use per-chip defaults)") \ + param(lvds_channel_mode, int, 0, _unsafe, 0400, \ + "Specify LVDS channel mode.", \ + "(0=probe BIOS, 1=single-channel, 2=dual-channel)") \ + param(panel_use_ssc, int, -1, _unsafe, 0600, \ + "Use Spread Spectrum Clock with panels [LVDS/eDP].", \ + "(-1=auto from VBT)") \ + param(vbt_sdvo_panel_type, int, -1, _unsafe, 0400, \ + "Override/Ignore selection of SDVO panel mode in the VBT.", \ + "(-2=ignore, -1=auto, 0..n=index in VBT BIOS table)") \ + param(enable_rc6, int, -1, _unsafe, 0400, \ + "Enable power-saving render C-state 6.", \ + "(-1=use per-chip default, 0=disable, 1=enable rc6, 2=enable deep rc6, 4=enable deepest rc6)" \ + "Different stages can be selected via bitmask values. " \ + "For example, 3 would enable rc6 and deep rc6, and 7 would enable everything. ") \ + param(enable_dc, int, -1, _unsafe, 0400, \ + "Enable power-saving display C-states.", \ + "(-1=auto, 0=disable, 1=up to DC5, 2=up to DC6)") \ + param(enable_fbc, int, -1, _unsafe, 0600, \ + "Enable frame buffer compression for power savings.", \ + "(-1=use per-chip default)") \ + param(enable_ppgtt, int, -1, _unsafe, 0400, \ + "Override PPGTT usage.", \ + "(-1=auto, 0=disabled, 1=aliasing, 2=full, 3=full with extended address space)") \ + param(enable_execlists, int, -1, _unsafe, 0400, \ + "Override execlists usage.", \ + "(-1=auto, 0=disabled, 1=enabled)") \ + param(enable_psr, int, -1, _unsafe, 0600, \ + "Enable PSR.", \ + "(-1=use per-chip default, " \ + "0=disabled, 1=link mode chosen per-platform, " \ + "2=force link-standby mode, 3=force link-off mode)") \ + param(disable_power_well, int, -1, _unsafe, 0400, \ + "Disable display power wells when possible.", \ + "(-1=auto, 0=power wells always on, 1=power wells disabled when possible)") \ + param(enable_ips, int, 1, _unsafe, 0600, \ + "Enable IPS.", ) \ + param(invert_brightness, int, 0, _unsafe, 0600, \ + "Invert backlight brightness.", \ + "Please report PCI device ID, subsystem vendor and subsystem " \ + "device ID to dri-devel@lists.freedesktop.org, if your machine " \ + "needs it. It will then be included in an upcoming module version. " \ + "(-1=force normal, 0=machine defaults, 1=force inversion)") \ + param(enable_guc_loading, int, 0, _unsafe, 0400, \ + "Enable GuC firmware loading.", \ + "(-1=auto, 0=never, 1=if available, 2=required)") \ + param(enable_guc_submission, int, 0, _unsafe, 0400, \ + "Enable GuC submission.", \ + "(-1=auto, 0=never, 1=if available, 2=required)") \ + param(guc_log_level, int, -1, _unsafe, 0400, \ + "GuC firmware logging level.", \ + "(-1:disabled, 0-3:enabled)") \ + param(guc_firmware_path, charp, NULL, _unsafe, 0400, \ + "GuC firmware path to use instead of the default one.", ) \ + param(huc_firmware_path, charp, NULL, _unsafe, 0400, \ + "HuC firmware path to use instead of the default one.", ) \ + param(use_mmio_flip, int, 0, _unsafe, 0600, \ + "Use MMIO flips.", \ + "(-1=never, 0=driver discretion, 1=always)") \ + param(mmio_debug, int, 0, /*safe*/, 0600, \ + "Enable the MMIO debug code for the first N failures.", \ + "This may negatively affect performance. ") \ + param(edp_vswing, int, 0, _unsafe, 0400, \ + "Ignore/Override vswing pre-emph table selection from VBT.", \ + "(0=use value from VBT, 1=low power swing(200mV), 2=default swing(400mV))") \ + param(inject_load_failure, uint, 0, _unsafe, 0400, \ + "For developers only: Force an error after a number of failure check points.", \ + "(0:disabled, N:force failure at the Nth failure check point)") \ /* leave bools at the end to not create holes */ \ - func(bool, alpha_support); \ - func(bool, enable_cmd_parser); \ - func(bool, enable_hangcheck); \ - func(bool, fastboot); \ - func(bool, prefault_disable); \ - func(bool, load_detect_test); \ - func(bool, force_reset_modeset_test); \ - func(bool, reset); \ - func(bool, error_capture); \ - func(bool, disable_display); \ - func(bool, verbose_state_checks); \ - func(bool, nuclear_pageflip); \ - func(bool, enable_dp_mst); \ - func(bool, enable_dpcd_backlight); \ - func(bool, enable_gvt) + param(alpha_support, bool, IS_ENABLED(CONFIG_DRM_I915_ALPHA_SUPPORT), _unsafe, 0400, \ + "Enable alpha quality driver support for latest hardware.", \ + "See also CONFIG_DRM_I915_ALPHA_SUPPORT. " ) \ + param(enable_cmd_parser, bool, true, _unsafe, 0400, \ + "Enable command parsing.", \ + "(true=enabled, false=disabled)") \ + param(enable_hangcheck, bool, true, _unsafe, 0644, \ + "Periodically check GPU activity for detecting hangs.", \ + "WARNING: Disabling this can cause system wide hangs! ") \ + param(fastboot, bool, false, /*safe*/, 0600, \ + "Try to skip unnecessary mode sets at boot time.", ) \ + param(prefault_disable, bool, false, _unsafe, 0600, \ + "For developers only: Disable page prefaulting for pread/pwrite/reloc.", ) \ + param(load_detect_test, bool, false, _unsafe, 0600, \ + "For developers only: Force-enable the VGA load detect code for testing.", ) \ + param(force_reset_modeset_test, bool, false, _unsafe, 0600, \ + "For developers only: Force a modeset during gpu reset for testing.", ) \ + param(reset, bool, true, _unsafe, 0600, \ + "Attempt GPU resets.", ) \ + param(disable_display, bool, false, /*safe*/, 0400, \ + "Disable display.", ) \ + param(verbose_state_checks, bool, true, /*safe*/, 0600, \ + "Enable verbose logs (ie. WARN_ON()) in case of unexpected HW state conditions.", ) \ + param(nuclear_pageflip, bool, false, _unsafe, 0400, \ + "Force enable atomic functionality on platforms that don't have full support yet.", ) \ + param(enable_dp_mst, bool, true, _unsafe, 0600, \ + "Enable multi-stream transport (MST) for new DisplayPort sinks.", ) \ + param(enable_dpcd_backlight, bool, false, /*safe*/, 0600, \ + "Enable support for DPCD backlight control.", ) \ + param(enable_gvt, bool, false, /*safe*/, 0400, \ + "Enable support for Intel GVT-g graphics virtualization host support.", ) \ + /* consume \ */ + +#if IS_ENABLED(CONFIG_DRM_I915_CAPTURE_ERROR) +#define _I915_PARAMS_FOR_EACH_CONFIG_ERROR(param) \ + param(error_capture, bool, true, /*safe*/, 0600, \ + "Record the GPU state following a hang.", \ + "This information in /sys/class/drm/card/error is vital for triaging and debugging hangs. ") +#else +#define _I915_PARAMS_FOR_EACH_CONFIG_ERROR(param) +#endif + +#define I915_PARAMS_FOR_EACH(param) \ + _I915_PARAMS_FOR_EACH_BASE(param) \ + _I915_PARAMS_FOR_EACH_CONFIG_ERROR(param) \ + /* consume \ */ -#define MEMBER(T, member) T member +#define charp char* +#define MEMBER(name, type, value, unsafe, mode, brief, detailed) type name; struct i915_params { - I915_PARAMS_FOR_EACH(MEMBER); + I915_PARAMS_FOR_EACH(MEMBER) }; #undef MEMBER +#undef charp extern struct i915_params i915 __read_mostly; #endif -