@@ -221,17 +221,20 @@ static u32 get_core_family(struct drm_i915_private *dev_priv)
}
}
-static u32 get_log_verbosity_flags(void)
+static u32 get_log_control_flags(void)
{
- if (i915_modparams.guc_log_level > 0) {
- u32 verbosity = i915_modparams.guc_log_level - 1;
+ u32 level = i915_modparams.guc_log_level;
+ u32 flags = 0;
- GEM_BUG_ON(verbosity > GUC_LOG_VERBOSITY_MAX);
- return verbosity << GUC_LOG_VERBOSITY_SHIFT;
- }
+ GEM_BUG_ON(level < 0);
+
+ if (!GUC_LOG_LEVEL_TO_ENABLED(level))
+ flags = GUC_LOG_DEFAULT_DISABLED | GUC_LOG_DISABLED;
+ else if (GUC_LOG_LEVEL_TO_VERBOSE(level))
+ flags = GUC_LOG_LEVEL_TO_VERBOSITY(level) <<
+ GUC_LOG_VERBOSITY_SHIFT;
- GEM_BUG_ON(i915_modparams.enable_guc < 0);
- return GUC_LOG_DISABLED;
+ return flags;
}
/*
@@ -266,7 +269,7 @@ void intel_guc_init_params(struct intel_guc *guc)
params[GUC_CTL_LOG_PARAMS] = guc->log.flags;
- params[GUC_CTL_DEBUG] = get_log_verbosity_flags();
+ params[GUC_CTL_DEBUG] = get_log_control_flags();
/* If GuC submission is enabled, set up additional parameters here */
if (USES_GUC_SUBMISSION(dev_priv)) {
@@ -127,7 +127,7 @@
#define GUC_PROFILE_ENABLED (1 << 7)
#define GUC_WQ_TRACK_ENABLED (1 << 8)
#define GUC_ADS_ENABLED (1 << 9)
-#define GUC_DEBUG_RESERVED (1 << 10)
+#define GUC_LOG_DEFAULT_DISABLED (1 << 10)
#define GUC_ADS_ADDR_SHIFT 11
#define GUC_ADS_ADDR_MASK 0xfffff800
@@ -539,7 +539,8 @@ union guc_log_control {
u32 logging_enabled:1;
u32 reserved1:3;
u32 verbosity:4;
- u32 reserved2:24;
+ u32 default_logging:1;
+ u32 reserved2:23;
};
u32 value;
} __packed;
@@ -58,12 +58,14 @@ static int guc_log_flush(struct intel_guc *guc)
return intel_guc_send(guc, action, ARRAY_SIZE(action));
}
-static int guc_log_control(struct intel_guc *guc, bool enable, u32 verbosity)
+static int guc_log_control(struct intel_guc *guc, bool enable,
+ bool default_logging, u32 verbosity)
{
union guc_log_control control_val = {
{
.logging_enabled = enable,
.verbosity = verbosity,
+ .default_logging = default_logging,
},
};
u32 action[] = {
@@ -501,13 +503,6 @@ int intel_guc_log_level_get(struct intel_guc *guc)
return i915_modparams.guc_log_level;
}
-#define GUC_LOG_LEVEL_DISABLED 0
-#define LOG_LEVEL_TO_ENABLED(x) ((x) > 0)
-#define LOG_LEVEL_TO_VERBOSITY(x) ({ \
- typeof(x) _x = (x); \
- LOG_LEVEL_TO_ENABLED(_x) ? _x - 1 : 0; \
-})
-#define VERBOSITY_TO_LOG_LEVEL(x) ((x) + 1)
int intel_guc_log_level_set(struct intel_guc *guc, u64 val)
{
struct drm_i915_private *dev_priv = guc_to_i915(guc);
@@ -522,7 +517,7 @@ int intel_guc_log_level_set(struct intel_guc *guc, u64 val)
* as indication that logging should be disabled.
*/
if (val < GUC_LOG_LEVEL_DISABLED ||
- val > VERBOSITY_TO_LOG_LEVEL(GUC_LOG_VERBOSITY_MAX))
+ val > GUC_VERBOSITY_TO_LOG_LEVEL(GUC_LOG_VERBOSITY_MAX))
return -EINVAL;
mutex_lock(&dev_priv->drm.struct_mutex);
@@ -533,8 +528,9 @@ int intel_guc_log_level_set(struct intel_guc *guc, u64 val)
}
intel_runtime_pm_get(dev_priv);
- ret = guc_log_control(guc, LOG_LEVEL_TO_ENABLED(val),
- LOG_LEVEL_TO_VERBOSITY(val));
+ ret = guc_log_control(guc, GUC_LOG_LEVEL_TO_VERBOSE(val),
+ GUC_LOG_LEVEL_TO_ENABLED(val),
+ GUC_LOG_LEVEL_TO_VERBOSITY(val));
intel_runtime_pm_put(dev_priv);
if (ret) {
DRM_DEBUG_DRIVER("guc_log_control action failed %d\n", ret);
@@ -39,6 +39,21 @@ struct intel_guc;
#define GUC_LOG_SIZE ((1 + GUC_LOG_DPC_PAGES + 1 + GUC_LOG_ISR_PAGES + \
1 + GUC_LOG_CRASH_PAGES + 1) << PAGE_SHIFT)
+/*
+ * While we're using plain log level in i915, GuC controls are much more...
+ * "elaborate"? We have a couple of bits for verbosity, separate bit for actual
+ * log enabling, and separate bit for default logging - which "conveniently"
+ * ignores the enable bit.
+ */
+#define GUC_LOG_LEVEL_DISABLED 0
+#define GUC_LOG_LEVEL_TO_ENABLED(x) ((x) > 0)
+#define GUC_LOG_LEVEL_TO_VERBOSE(x) ((x) > 1)
+#define GUC_LOG_LEVEL_TO_VERBOSITY(x) ({ \
+ typeof(x) _x = (x); \
+ GUC_LOG_LEVEL_TO_ENABLED(_x) ? _x - 2 : 0; \
+})
+#define GUC_VERBOSITY_TO_LOG_LEVEL(x) ((x) + 2)
+
struct intel_guc_log {
u32 flags;
struct i915_vma *vma;
@@ -75,7 +75,8 @@ static int __get_default_guc_log_level(struct drm_i915_private *dev_priv)
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;
+ guc_log_level =
+ GUC_VERBOSITY_TO_LOG_LEVEL(GUC_LOG_VERBOSITY_MAX);
/* Any platform specific fine-tuning can be done here */
@@ -142,17 +143,20 @@ void intel_uc_sanitize_options(struct drm_i915_private *dev_priv)
i915_modparams.guc_log_level = 0;
}
- if (i915_modparams.guc_log_level > 1 + GUC_LOG_VERBOSITY_MAX) {
+ if (i915_modparams.guc_log_level >
+ GUC_VERBOSITY_TO_LOG_LEVEL(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;
+ i915_modparams.guc_log_level =
+ GUC_VERBOSITY_TO_LOG_LEVEL(GUC_LOG_VERBOSITY_MAX);
}
- DRM_DEBUG_DRIVER("guc_log_level=%d (enabled:%s verbosity:%d)\n",
+ DRM_DEBUG_DRIVER("guc_log_level=%d (enabled:%s, verbose:%s, verbosity:%d)\n",
i915_modparams.guc_log_level,
yesno(i915_modparams.guc_log_level),
- i915_modparams.guc_log_level - 1);
+ yesno(GUC_LOG_LEVEL_TO_VERBOSE(i915_modparams.guc_log_level)),
+ GUC_LOG_LEVEL_TO_VERBOSITY(i915_modparams.guc_log_level));
/* Make sure that sanitization was done */
GEM_BUG_ON(i915_modparams.enable_guc < 0);