diff mbox

[13/15] drm/i915/guc: Allow user to control default GuC logging

Message ID 20180227125230.13000-13-michal.winiarski@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Michał Winiarski Feb. 27, 2018, 12:52 p.m. UTC
While both naming and actual log enable logic in GuC interface are
confusing, we can simply expose the default log as yet another log
level.
GuC logic aside, from i915 point of view we now have the following GuC
log levels:
	0 Log disabled
	1 Non-verbose log
	2-5 Verbose log

Signed-off-by: Michał Winiarski <michal.winiarski@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Sagar Arun Kamble <sagar.a.kamble@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
---
 drivers/gpu/drm/i915/intel_guc.c      | 21 ++++++++++++---------
 drivers/gpu/drm/i915/intel_guc_fwif.h |  5 +++--
 drivers/gpu/drm/i915/intel_guc_log.c  |  9 +++++----
 drivers/gpu/drm/i915/intel_guc_log.h  | 11 +++++++++++
 drivers/gpu/drm/i915/intel_uc.c       | 14 +++++++++-----
 5 files changed, 40 insertions(+), 20 deletions(-)

Comments

sagar.a.kamble@intel.com March 6, 2018, 11:58 a.m. UTC | #1
On 2/27/2018 6:22 PM, Michał Winiarski wrote:
> While both naming and actual log enable logic in GuC interface are
> confusing, we can simply expose the default log as yet another log
> level.
> GuC logic aside, from i915 point of view we now have the following GuC
> log levels:
> 	0 Log disabled
> 	1 Non-verbose log
> 	2-5 Verbose log
>
> Signed-off-by: Michał Winiarski <michal.winiarski@intel.com>
> Cc: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
> Cc: Sagar Arun Kamble <sagar.a.kamble@intel.com>
> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Change looks good.
Reviewed-by: Sagar Arun Kamble <sagar.a.kamble@intel.com>

Firmware should have enabled default logging internally without user 
controls or should have created new verbosity level.
This was supposed to be fixed in the firmware based on the discussion 
here https://patchwork.freedesktop.org/patch/178281/
Until this gets fixed in firmware, this patch will be needed for 
multiple log captures.
> ---
>   drivers/gpu/drm/i915/intel_guc.c      | 21 ++++++++++++---------
>   drivers/gpu/drm/i915/intel_guc_fwif.h |  5 +++--
>   drivers/gpu/drm/i915/intel_guc_log.c  |  9 +++++----
>   drivers/gpu/drm/i915/intel_guc_log.h  | 11 +++++++++++
>   drivers/gpu/drm/i915/intel_uc.c       | 14 +++++++++-----
>   5 files changed, 40 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_guc.c b/drivers/gpu/drm/i915/intel_guc.c
> index 0500b4164254..83d813a6ff92 100644
> --- a/drivers/gpu/drm/i915/intel_guc.c
> +++ b/drivers/gpu/drm/i915/intel_guc.c
> @@ -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_IS_ENABLED(level))
> +		flags = GUC_LOG_DEFAULT_DISABLED | GUC_LOG_DISABLED;
> +	else if (GUC_LOG_IS_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)) {
> diff --git a/drivers/gpu/drm/i915/intel_guc_fwif.h b/drivers/gpu/drm/i915/intel_guc_fwif.h
> index 6a10aa6f04d3..4971685a2ea8 100644
> --- a/drivers/gpu/drm/i915/intel_guc_fwif.h
> +++ b/drivers/gpu/drm/i915/intel_guc_fwif.h
> @@ -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;
> diff --git a/drivers/gpu/drm/i915/intel_guc_log.c b/drivers/gpu/drm/i915/intel_guc_log.c
> index bdf6b3178488..ade7dadc34b8 100644
> --- a/drivers/gpu/drm/i915/intel_guc_log.c
> +++ b/drivers/gpu/drm/i915/intel_guc_log.c
> @@ -58,11 +58,13 @@ 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[] = {
>   		INTEL_GUC_ACTION_UK_LOG_ENABLE_LOGGING,
> @@ -506,8 +508,6 @@ int intel_guc_log_level_get(struct intel_guc *guc)
>   	return i915_modparams.guc_log_level;
>   }
>   
> -#define GUC_LOG_IS_ENABLED(x)		(x > 0)
> -#define GUC_LOG_LEVEL_TO_VERBOSITY(x)	(GUC_LOG_IS_ENABLED(x) ? x - 1 : 0)
>   int intel_guc_log_level_set(struct intel_guc *guc, u64 val)
>   {
>   	struct drm_i915_private *dev_priv = guc_to_i915(guc);
> @@ -533,7 +533,8 @@ int intel_guc_log_level_set(struct intel_guc *guc, u64 val)
>   	}
>   
>   	intel_runtime_pm_get(dev_priv);
> -	ret = guc_log_control(guc, GUC_LOG_IS_ENABLED(val),
> +	ret = guc_log_control(guc, GUC_LOG_IS_VERBOSE(val),
> +			      GUC_LOG_IS_ENABLED(val),
>   			      GUC_LOG_LEVEL_TO_VERBOSITY(val));
>   	intel_runtime_pm_put(dev_priv);
>   	if (ret)
> diff --git a/drivers/gpu/drm/i915/intel_guc_log.h b/drivers/gpu/drm/i915/intel_guc_log.h
> index a8ccb04e2b0a..a91d94da5543 100644
> --- a/drivers/gpu/drm/i915/intel_guc_log.h
> +++ b/drivers/gpu/drm/i915/intel_guc_log.h
> @@ -39,6 +39,17 @@ 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_IS_ENABLED(x)		(x > 0)
> +#define GUC_LOG_IS_VERBOSE(x)		(x > 1)
> +#define GUC_LOG_LEVEL_TO_VERBOSITY(x)	(GUC_LOG_IS_VERBOSE(x) ? x - 2 : 0)
> +#define GUC_LOG_VERBOSITY_TO_LEVEL(x)	(x + 2)
> +
>   struct intel_guc_log {
>   	u32 flags;
>   	struct i915_vma *vma;
> diff --git a/drivers/gpu/drm/i915/intel_uc.c b/drivers/gpu/drm/i915/intel_uc.c
> index 27e1f4c43b7b..9884a79c77bd 100644
> --- a/drivers/gpu/drm/i915/intel_uc.c
> +++ b/drivers/gpu/drm/i915/intel_uc.c
> @@ -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_LOG_VERBOSITY_TO_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_LOG_VERBOSITY_TO_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_LOG_VERBOSITY_TO_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_IS_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);
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/intel_guc.c b/drivers/gpu/drm/i915/intel_guc.c
index 0500b4164254..83d813a6ff92 100644
--- a/drivers/gpu/drm/i915/intel_guc.c
+++ b/drivers/gpu/drm/i915/intel_guc.c
@@ -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_IS_ENABLED(level))
+		flags = GUC_LOG_DEFAULT_DISABLED | GUC_LOG_DISABLED;
+	else if (GUC_LOG_IS_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)) {
diff --git a/drivers/gpu/drm/i915/intel_guc_fwif.h b/drivers/gpu/drm/i915/intel_guc_fwif.h
index 6a10aa6f04d3..4971685a2ea8 100644
--- a/drivers/gpu/drm/i915/intel_guc_fwif.h
+++ b/drivers/gpu/drm/i915/intel_guc_fwif.h
@@ -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;
diff --git a/drivers/gpu/drm/i915/intel_guc_log.c b/drivers/gpu/drm/i915/intel_guc_log.c
index bdf6b3178488..ade7dadc34b8 100644
--- a/drivers/gpu/drm/i915/intel_guc_log.c
+++ b/drivers/gpu/drm/i915/intel_guc_log.c
@@ -58,11 +58,13 @@  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[] = {
 		INTEL_GUC_ACTION_UK_LOG_ENABLE_LOGGING,
@@ -506,8 +508,6 @@  int intel_guc_log_level_get(struct intel_guc *guc)
 	return i915_modparams.guc_log_level;
 }
 
-#define GUC_LOG_IS_ENABLED(x)		(x > 0)
-#define GUC_LOG_LEVEL_TO_VERBOSITY(x)	(GUC_LOG_IS_ENABLED(x) ? x - 1 : 0)
 int intel_guc_log_level_set(struct intel_guc *guc, u64 val)
 {
 	struct drm_i915_private *dev_priv = guc_to_i915(guc);
@@ -533,7 +533,8 @@  int intel_guc_log_level_set(struct intel_guc *guc, u64 val)
 	}
 
 	intel_runtime_pm_get(dev_priv);
-	ret = guc_log_control(guc, GUC_LOG_IS_ENABLED(val),
+	ret = guc_log_control(guc, GUC_LOG_IS_VERBOSE(val),
+			      GUC_LOG_IS_ENABLED(val),
 			      GUC_LOG_LEVEL_TO_VERBOSITY(val));
 	intel_runtime_pm_put(dev_priv);
 	if (ret)
diff --git a/drivers/gpu/drm/i915/intel_guc_log.h b/drivers/gpu/drm/i915/intel_guc_log.h
index a8ccb04e2b0a..a91d94da5543 100644
--- a/drivers/gpu/drm/i915/intel_guc_log.h
+++ b/drivers/gpu/drm/i915/intel_guc_log.h
@@ -39,6 +39,17 @@  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_IS_ENABLED(x)		(x > 0)
+#define GUC_LOG_IS_VERBOSE(x)		(x > 1)
+#define GUC_LOG_LEVEL_TO_VERBOSITY(x)	(GUC_LOG_IS_VERBOSE(x) ? x - 2 : 0)
+#define GUC_LOG_VERBOSITY_TO_LEVEL(x)	(x + 2)
+
 struct intel_guc_log {
 	u32 flags;
 	struct i915_vma *vma;
diff --git a/drivers/gpu/drm/i915/intel_uc.c b/drivers/gpu/drm/i915/intel_uc.c
index 27e1f4c43b7b..9884a79c77bd 100644
--- a/drivers/gpu/drm/i915/intel_uc.c
+++ b/drivers/gpu/drm/i915/intel_uc.c
@@ -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_LOG_VERBOSITY_TO_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_LOG_VERBOSITY_TO_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_LOG_VERBOSITY_TO_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_IS_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);