drm/i915/guc: Redefine guc_log_level modparam values
authorMichal Wajdeczko <michal.wajdeczko@intel.com>
Thu, 11 Jan 2018 15:24:40 +0000 (15:24 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Thu, 18 Jan 2018 17:15:48 +0000 (17:15 +0000)
We used value -1 to indicate "disabled" and values 0..3 to
indicate "enabled", but most of our other modparams are using
-1 for "auto" mode and 0 for "disable". For consistency let's
change our log level values to:

-1: auto (depends on platform and Kconfig.debug settings)
 0: disabled
 1: enabled (severity level 0 = min)
 2: enabled (severity level 1)
 3: enabled (severity level 2)
 4: enabled (severity level 3 = max)

v2: fix commit message (Sagar)
    display sanitized modparam value (Sagar)
    unify sanitize messages (Sagar/Michal)

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Sagar Arun Kamble <sagar.a.kamble@intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20180111152441.21676-1-michal.wajdeczko@intel.com
Reviewed-by: Sagar Arun Kamble <sagar.a.kamble@intel.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
drivers/gpu/drm/i915/i915_params.c
drivers/gpu/drm/i915/intel_guc.c
drivers/gpu/drm/i915/intel_guc_log.c
drivers/gpu/drm/i915/intel_uc.c

index b5f3eb4..0b553a8 100644 (file)
@@ -155,7 +155,8 @@ i915_param_named_unsafe(enable_guc, int, 0400,
        "(-1=auto, 0=disable [default], 1=GuC submission, 2=HuC load)");
 
 i915_param_named(guc_log_level, int, 0400,
-       "GuC firmware logging level (-1:disabled (default), 0-3:enabled)");
+       "GuC firmware logging level. Requires GuC to be loaded. "
+       "(-1=auto [default], 0=disable, 1..4=enable with verbosity min..max)");
 
 i915_param_named_unsafe(guc_firmware_path, charp, 0400,
        "GuC firmware path to use instead of the default one");
index 50b4725..ea30e7c 100644 (file)
@@ -215,6 +215,19 @@ static u32 get_core_family(struct drm_i915_private *dev_priv)
        }
 }
 
+static u32 get_log_verbosity_flags(void)
+{
+       if (i915_modparams.guc_log_level > 0) {
+               u32 verbosity = i915_modparams.guc_log_level - 1;
+
+               GEM_BUG_ON(verbosity > GUC_LOG_VERBOSITY_MAX);
+               return verbosity << GUC_LOG_VERBOSITY_SHIFT;
+       }
+
+       GEM_BUG_ON(i915_modparams.enable_guc < 0);
+       return GUC_LOG_DISABLED;
+}
+
 /*
  * Initialise the GuC parameter block before starting the firmware
  * transfer. These parameters are read by the firmware on startup
@@ -247,12 +260,7 @@ void intel_guc_init_params(struct intel_guc *guc)
 
        params[GUC_CTL_LOG_PARAMS] = guc->log.flags;
 
-       if (i915_modparams.guc_log_level >= 0) {
-               params[GUC_CTL_DEBUG] =
-                       i915_modparams.guc_log_level << GUC_LOG_VERBOSITY_SHIFT;
-       } else {
-               params[GUC_CTL_DEBUG] = GUC_LOG_DISABLED;
-       }
+       params[GUC_CTL_DEBUG] = get_log_verbosity_flags();
 
        /* If GuC submission is enabled, set up additional parameters here */
        if (USES_GUC_SUBMISSION(dev_priv)) {
@@ -445,7 +453,7 @@ int intel_guc_resume(struct drm_i915_private *dev_priv)
        if (guc->fw.load_status != INTEL_UC_FIRMWARE_SUCCESS)
                return 0;
 
-       if (i915_modparams.guc_log_level >= 0)
+       if (i915_modparams.guc_log_level)
                gen9_enable_guc_interrupts(dev_priv);
 
        data[0] = INTEL_GUC_ACTION_EXIT_S_STATE;
index eaedd63..e6d59bf 100644 (file)
@@ -33,11 +33,10 @@ static void guc_log_capture_logs(struct intel_guc *guc);
 /**
  * DOC: GuC firmware log
  *
- * Firmware log is enabled by setting i915.guc_log_level to non-negative level.
+ * Firmware log is enabled by setting i915.guc_log_level to the positive level.
  * Log data is printed out via reading debugfs i915_guc_log_dump. Reading from
  * i915_guc_load_status will print out firmware loading status and scratch
  * registers value.
- *
  */
 
 static int guc_log_flush_complete(struct intel_guc *guc)
@@ -147,7 +146,7 @@ static int guc_log_relay_file_create(struct intel_guc *guc)
        struct dentry *log_dir;
        int ret;
 
-       if (i915_modparams.guc_log_level < 0)
+       if (!i915_modparams.guc_log_level)
                return 0;
 
        /* For now create the log file in /sys/kernel/debug/dri/0 dir */
@@ -423,8 +422,8 @@ static void guc_log_runtime_destroy(struct intel_guc *guc)
 {
        /*
         * It's possible that the runtime stuff was never allocated because
-        * guc_log_level was < 0 at the time
-        **/
+        * GuC log was disabled at the boot time.
+        */
        if (!guc_log_has_runtime(guc))
                return;
 
@@ -441,9 +440,10 @@ static int guc_log_late_setup(struct intel_guc *guc)
        lockdep_assert_held(&dev_priv->drm.struct_mutex);
 
        if (!guc_log_has_runtime(guc)) {
-               /* If log_level was set as -1 at boot time, then setup needed to
-                * handle log buffer flush interrupts would not have been done yet,
-                * so do that now.
+               /*
+                * If log was disabled at boot time, then setup needed to handle
+                * log buffer flush interrupts would not have been done yet, so
+                * do that now.
                 */
                ret = guc_log_runtime_create(guc);
                if (ret)
@@ -460,7 +460,7 @@ err_runtime:
        guc_log_runtime_destroy(guc);
 err:
        /* logging will remain off */
-       i915_modparams.guc_log_level = -1;
+       i915_modparams.guc_log_level = 0;
        return ret;
 }
 
@@ -482,8 +482,7 @@ static void guc_flush_logs(struct intel_guc *guc)
 {
        struct drm_i915_private *dev_priv = guc_to_i915(guc);
 
-       if (!USES_GUC_SUBMISSION(dev_priv) ||
-           (i915_modparams.guc_log_level < 0))
+       if (!USES_GUC_SUBMISSION(dev_priv) || !i915_modparams.guc_log_level)
                return;
 
        /* First disable the interrupts, will be renabled afterwards */
@@ -511,9 +510,6 @@ int intel_guc_log_create(struct intel_guc *guc)
 
        GEM_BUG_ON(guc->log.vma);
 
-       if (i915_modparams.guc_log_level > GUC_LOG_VERBOSITY_MAX)
-               i915_modparams.guc_log_level = GUC_LOG_VERBOSITY_MAX;
-
        /* The first page is to save log buffer state. Allocate one
         * extra page for others in case for overlap */
        size = (1 + GUC_LOG_DPC_PAGES + 1 +
@@ -537,7 +533,7 @@ int intel_guc_log_create(struct intel_guc *guc)
 
        guc->log.vma = vma;
 
-       if (i915_modparams.guc_log_level >= 0) {
+       if (i915_modparams.guc_log_level) {
                ret = guc_log_runtime_create(guc);
                if (ret < 0)
                        goto err_vma;
@@ -558,7 +554,7 @@ err_vma:
        i915_vma_unpin_and_release(&guc->log.vma);
 err:
        /* logging will be off */
-       i915_modparams.guc_log_level = -1;
+       i915_modparams.guc_log_level = 0;
        return ret;
 }
 
@@ -582,7 +578,7 @@ int i915_guc_log_control(struct drm_i915_private *dev_priv, u64 control_val)
                return -EINVAL;
 
        /* This combination doesn't make sense & won't have any effect */
-       if (!log_param.logging_enabled && (i915_modparams.guc_log_level < 0))
+       if (!log_param.logging_enabled && !i915_modparams.guc_log_level)
                return 0;
 
        ret = guc_log_control(guc, log_param.value);
@@ -592,11 +588,12 @@ int i915_guc_log_control(struct drm_i915_private *dev_priv, u64 control_val)
        }
 
        if (log_param.logging_enabled) {
-               i915_modparams.guc_log_level = log_param.verbosity;
+               i915_modparams.guc_log_level = 1 + log_param.verbosity;
 
-               /* If log_level was set as -1 at boot time, then the relay channel file
-                * wouldn't have been created by now and interrupts also would not have
-                * been enabled. Try again now, just in case.
+               /*
+                * If log was disabled at boot time, then the relay channel file
+                * wouldn't have been created by now and interrupts also would
+                * not have been enabled. Try again now, just in case.
                 */
                ret = guc_log_late_setup(guc);
                if (ret < 0) {
@@ -607,7 +604,8 @@ int i915_guc_log_control(struct drm_i915_private *dev_priv, u64 control_val)
                /* GuC logging is currently the only user of Guc2Host interrupts */
                gen9_enable_guc_interrupts(dev_priv);
        } else {
-               /* Once logging is disabled, GuC won't generate logs & send an
+               /*
+                * Once logging is disabled, GuC won't generate logs & send an
                 * interrupt. But there could be some data in the log buffer
                 * which is yet to be captured. So request GuC to update the log
                 * buffer state and then collect the left over logs.
@@ -615,7 +613,7 @@ int i915_guc_log_control(struct drm_i915_private *dev_priv, u64 control_val)
                guc_flush_logs(guc);
 
                /* As logging is disabled, update log level to reflect that */
-               i915_modparams.guc_log_level = -1;
+               i915_modparams.guc_log_level = 0;
        }
 
        return ret;
@@ -623,8 +621,7 @@ int i915_guc_log_control(struct drm_i915_private *dev_priv, u64 control_val)
 
 void i915_guc_log_register(struct drm_i915_private *dev_priv)
 {
-       if (!USES_GUC_SUBMISSION(dev_priv) ||
-           (i915_modparams.guc_log_level < 0))
+       if (!USES_GUC_SUBMISSION(dev_priv) || !i915_modparams.guc_log_level)
                return;
 
        mutex_lock(&dev_priv->drm.struct_mutex);
index d82ca0f..f78a17b 100644 (file)
@@ -65,6 +65,21 @@ static int __get_platform_enable_guc(struct drm_i915_private *dev_priv)
        return enable_guc;
 }
 
+static int __get_default_guc_log_level(struct drm_i915_private *dev_priv)
+{
+       int guc_log_level = 0; /* disabled */
+
+       /* Enable if we're running on platform with GuC and debug config */
+       if (HAS_GUC(dev_priv) && intel_uc_is_using_guc() &&
+           (IS_ENABLED(CONFIG_DRM_I915_DEBUG) ||
+            IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM)))
+               guc_log_level = 1 + GUC_LOG_VERBOSITY_MAX;
+
+       /* Any platform specific fine-tuning can be done here */
+
+       return guc_log_level;
+}
+
 /**
  * intel_uc_sanitize_options - sanitize uC related modparam options
  * @dev_priv: device private
@@ -74,6 +89,13 @@ static int __get_platform_enable_guc(struct drm_i915_private *dev_priv)
  * modparam varies between platforms and it is hardcoded in driver code.
  * Any other modparam value is only monitored against availability of the
  * related hardware or firmware definitions.
+ *
+ * In case of "guc_log_level" option this function will attempt to modify
+ * it only if it was initially set to "auto(-1)" or if initial value was
+ * "enable(1..4)" on platforms without the GuC. Default value for this
+ * modparam varies between platforms and is usually set to "disable(0)"
+ * unless GuC is enabled on given platform and the driver is compiled with
+ * debug config when this modparam will default to "enable(1..4)".
  */
 void intel_uc_sanitize_options(struct drm_i915_private *dev_priv)
 {
@@ -91,22 +113,48 @@ void intel_uc_sanitize_options(struct drm_i915_private *dev_priv)
 
        /* Verify GuC firmware availability */
        if (intel_uc_is_using_guc() && !intel_uc_fw_is_selected(guc_fw)) {
-               DRM_WARN("Incompatible option detected: enable_guc=%d, %s!\n",
-                        i915_modparams.enable_guc,
+               DRM_WARN("Incompatible option detected: %s=%d, %s!\n",
+                        "enable_guc", i915_modparams.enable_guc,
                         !HAS_GUC(dev_priv) ? "no GuC hardware" :
                                              "no GuC firmware");
        }
 
        /* Verify HuC firmware availability */
        if (intel_uc_is_using_huc() && !intel_uc_fw_is_selected(huc_fw)) {
-               DRM_WARN("Incompatible option detected: enable_guc=%d, %s!\n",
-                        i915_modparams.enable_guc,
+               DRM_WARN("Incompatible option detected: %s=%d, %s!\n",
+                        "enable_guc", i915_modparams.enable_guc,
                         !HAS_HUC(dev_priv) ? "no HuC hardware" :
                                              "no HuC firmware");
        }
 
+       /* A negative value means "use platform/config default" */
+       if (i915_modparams.guc_log_level < 0)
+               i915_modparams.guc_log_level =
+                       __get_default_guc_log_level(dev_priv);
+
+       if (i915_modparams.guc_log_level > 0 && !intel_uc_is_using_guc()) {
+               DRM_WARN("Incompatible option detected: %s=%d, %s!\n",
+                        "guc_log_level", i915_modparams.guc_log_level,
+                        !HAS_GUC(dev_priv) ? "no GuC hardware" :
+                                             "GuC not enabled");
+               i915_modparams.guc_log_level = 0;
+       }
+
+       if (i915_modparams.guc_log_level > 1 + GUC_LOG_VERBOSITY_MAX) {
+               DRM_WARN("Incompatible option detected: %s=%d, %s!\n",
+                        "guc_log_level", i915_modparams.guc_log_level,
+                        "verbosity too high");
+               i915_modparams.guc_log_level = 1 + GUC_LOG_VERBOSITY_MAX;
+       }
+
+       DRM_DEBUG_DRIVER("guc_log_level=%d (enabled:%s verbosity:%d)\n",
+                        i915_modparams.guc_log_level,
+                        yesno(i915_modparams.guc_log_level),
+                        i915_modparams.guc_log_level - 1);
+
        /* Make sure that sanitization was done */
        GEM_BUG_ON(i915_modparams.enable_guc < 0);
+       GEM_BUG_ON(i915_modparams.guc_log_level < 0);
 }
 
 void intel_uc_init_early(struct drm_i915_private *dev_priv)
@@ -152,7 +200,7 @@ void intel_uc_init_mmio(struct drm_i915_private *dev_priv)
 
 static void guc_capture_load_err_log(struct intel_guc *guc)
 {
-       if (!guc->log.vma || i915_modparams.guc_log_level < 0)
+       if (!guc->log.vma || !i915_modparams.guc_log_level)
                return;
 
        if (!guc->load_err_log)
@@ -322,7 +370,7 @@ int intel_uc_init_hw(struct drm_i915_private *dev_priv)
        }
 
        if (USES_GUC_SUBMISSION(dev_priv)) {
-               if (i915_modparams.guc_log_level >= 0)
+               if (i915_modparams.guc_log_level)
                        gen9_enable_guc_interrupts(dev_priv);
 
                ret = intel_guc_submission_enable(guc);