diff mbox

[09/10] drm/i915/uc: Separate firmware selection and preparation

Message ID 20170224154004.17821-10-arkadiusz.hiler@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Arkadiusz Hiler Feb. 24, 2017, 3:40 p.m. UTC
intel_{h,g}uc_init_fw selects correct firmware and then triggers it's
preparation (fetch + initial parsing).

This change separates out select steps, so those can be called by
the sanitize_options().

Then, during the init_fw() we prepare the firmware if the firmware was
selected.

Cc: Michal Winiarski <michal.winiarski@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: Arkadiusz Hiler <arkadiusz.hiler@intel.com>
---
 drivers/gpu/drm/i915/intel_guc_loader.c | 12 ++----------
 drivers/gpu/drm/i915/intel_huc.c        | 14 ++------------
 drivers/gpu/drm/i915/intel_uc.c         | 20 ++++++++++++++------
 drivers/gpu/drm/i915/intel_uc.h         |  4 ++--
 4 files changed, 20 insertions(+), 30 deletions(-)

Comments

Michal Wajdeczko Feb. 24, 2017, 6:29 p.m. UTC | #1
On Fri, Feb 24, 2017 at 04:40:03PM +0100, Arkadiusz Hiler wrote:
> intel_{h,g}uc_init_fw selects correct firmware and then triggers it's
> preparation (fetch + initial parsing).
> 
> This change separates out select steps, so those can be called by
> the sanitize_options().
> 
> Then, during the init_fw() we prepare the firmware if the firmware was
> selected.
> 
> Cc: Michal Winiarski <michal.winiarski@intel.com>
> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
> Signed-off-by: Arkadiusz Hiler <arkadiusz.hiler@intel.com>
> ---

It looks strange that in one series you're changing function names
or their logic few times ... patch ordering really matters ;)

Please consider reorder/squash.


>  drivers/gpu/drm/i915/intel_guc_loader.c | 12 ++----------
>  drivers/gpu/drm/i915/intel_huc.c        | 14 ++------------
>  drivers/gpu/drm/i915/intel_uc.c         | 20 ++++++++++++++------
>  drivers/gpu/drm/i915/intel_uc.h         |  4 ++--
>  4 files changed, 20 insertions(+), 30 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_guc_loader.c b/drivers/gpu/drm/i915/intel_guc_loader.c
> index 64f50bd..8ccd832 100644
> --- a/drivers/gpu/drm/i915/intel_guc_loader.c
> +++ b/drivers/gpu/drm/i915/intel_guc_loader.c
> @@ -467,15 +467,10 @@ int intel_guc_init_hw(struct drm_i915_private *dev_priv)
>  }
>  
>  /**
> - * intel_guc_init_fw() - select and prepare firmware for loading
> + * intel_guc_select_fw() - selects GuC firmware for loading
>   * @guc:	intel_guc struct
> - *
> - * Called early during driver load, but after GEM is initialised.
> - *
> - * The firmware will be transferred to the GuC's memory later,
> - * when intel_guc_init_hw() is called.
>   */
> -void intel_guc_init_fw(struct intel_guc *guc)
> +void intel_guc_select_fw(struct intel_guc *guc)
>  {
>  	struct drm_i915_private *dev_priv = guc_to_i915(guc);
>  
> @@ -498,11 +493,8 @@ void intel_guc_init_fw(struct intel_guc *guc)
>  		guc->fw.minor_ver_wanted = KBL_FW_MINOR;
>  	} else {
>  		DRM_ERROR("No GuC firmware known for platform with GuC!\n");
> -		i915.enable_guc_loading = 0;
>  		return;
>  	}
> -
> -	intel_uc_prepare_fw(dev_priv, &guc->fw);
>  }
>  
>  /**
> diff --git a/drivers/gpu/drm/i915/intel_huc.c b/drivers/gpu/drm/i915/intel_huc.c
> index 757f618..d073a68 100644
> --- a/drivers/gpu/drm/i915/intel_huc.c
> +++ b/drivers/gpu/drm/i915/intel_huc.c
> @@ -141,18 +141,10 @@ static int huc_ucode_xfer(struct drm_i915_private *dev_priv)
>  }
>  
>  /**
> - * intel_huc_init_fw() - select and prepare firmware for loading
> + * intel_huc_select_fw() - selects HuC firmware for loading
>   * @huc:	intel_huc struct
> - *
> - * Called early during driver load, but after GEM is initialised. The loading
> - * will continue only when driver explicitly specify firmware name and version.
> - * All other cases are considered as INTEL_UC_FIRMWARE_NONE either because HW
> - * is not capable or driver yet support it. And there will be no error message
> - * for INTEL_UC_FIRMWARE_NONE cases.
> - *
> - * The DMA-copying to HW is done later when intel_huc_init_hw() is called.
>   */
> -void intel_huc_init_fw(struct intel_huc *huc)
> +void intel_huc_select_fw(struct intel_huc *huc)
>  {
>  	struct drm_i915_private *dev_priv = huc_to_i915(huc);
>  
> @@ -177,8 +169,6 @@ void intel_huc_init_fw(struct intel_huc *huc)
>  		DRM_ERROR("No HuC firmware known for platform with HuC!\n");
>  		return;
>  	}
> -
> -	intel_uc_prepare_fw(dev_priv, &huc->fw);
>  }
>  
>  /**
> diff --git a/drivers/gpu/drm/i915/intel_uc.c b/drivers/gpu/drm/i915/intel_uc.c
> index ac9ad59..89681b37 100644
> --- a/drivers/gpu/drm/i915/intel_uc.c
> +++ b/drivers/gpu/drm/i915/intel_uc.c
> @@ -66,6 +66,16 @@ void intel_uc_sanitize_options(struct drm_i915_private *dev_priv)
>  		if (!i915.enable_guc_loading)
>  			i915.enable_guc_submission = 0;
>  	}

Code below is only applicable to "else" from the above

> +
> +	if (i915.enable_guc_loading) {
> +		if (HAS_HUC_UCODE(dev_priv))
> +			intel_huc_select_fw(&dev_priv->huc);
> +
> +		intel_guc_select_fw(&dev_priv->guc);
> +
> +		if (!dev_priv->guc.fw.path)
> +			i915.enable_guc_loading = 0;

Maybe simpler like this:

	i915.enable_guc_loading = intel_guc_select_fw(guc);

and likely it can be done earlier too.


> +	}
>  }
>  
>  void intel_uc_init_early(struct drm_i915_private *dev_priv)
> @@ -75,13 +85,11 @@ void intel_uc_init_early(struct drm_i915_private *dev_priv)
>  
>  void intel_uc_init_fw(struct drm_i915_private *dev_priv)
>  {
> -	if (!i915.enable_guc_loading)
> -		return;
> +	if (dev_priv->huc.fw.path)

Maybe we can move this common "if" to "intel_uc_prepare_fw()" ?


-Michal

> +		intel_uc_prepare_fw(dev_priv, &dev_priv->huc.fw);
>  
> -	if (HAS_HUC_UCODE(dev_priv))
> -		intel_huc_init_fw(&dev_priv->huc);
> -
> -	intel_guc_init_fw(&dev_priv->guc);
> +	if (dev_priv->guc.fw.path)
> +		intel_uc_prepare_fw(dev_priv, &dev_priv->guc.fw);
>  }
>  
>  int intel_uc_init_hw(struct drm_i915_private *dev_priv)
> diff --git a/drivers/gpu/drm/i915/intel_uc.h b/drivers/gpu/drm/i915/intel_uc.h
> index d19c95e..5f04ea1 100644
> --- a/drivers/gpu/drm/i915/intel_uc.h
> +++ b/drivers/gpu/drm/i915/intel_uc.h
> @@ -194,7 +194,7 @@ void intel_uc_prepare_fw(struct drm_i915_private *dev_priv,
>  			 struct intel_uc_fw *uc_fw);
>  
>  /* intel_guc_loader.c */
> -void intel_guc_init_fw(struct intel_guc *guc);
> +void intel_guc_select_fw(struct intel_guc *guc);
>  int intel_guc_init_hw(struct drm_i915_private *dev_priv);
>  void intel_guc_fini(struct drm_i915_private *dev_priv);
>  const char *intel_uc_fw_status_repr(enum intel_uc_fw_status status);
> @@ -230,7 +230,7 @@ static inline u32 guc_ggtt_offset(struct i915_vma *vma)
>  }
>  
>  /* intel_huc.c */
> -void intel_huc_init_fw(struct intel_huc *huc);
> +void intel_huc_select_fw(struct intel_huc *huc);
>  void intel_huc_fini(struct drm_i915_private  *dev_priv);
>  int intel_huc_init_hw(struct drm_i915_private *dev_priv);
>  void intel_guc_auth_huc(struct drm_i915_private *dev_priv);
> -- 
> 2.9.3
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Joonas Lahtinen Feb. 27, 2017, 12:23 p.m. UTC | #2
On pe, 2017-02-24 at 16:40 +0100, Arkadiusz Hiler wrote:
> intel_{h,g}uc_init_fw selects correct firmware and then triggers it's
> preparation (fetch + initial parsing).
> 
> This change separates out select steps, so those can be called by
> the sanitize_options().
> 
> Then, during the init_fw() we prepare the firmware if the firmware was
> selected.
> 
> Cc: Michal Winiarski <michal.winiarski@intel.com>
> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
> Signed-off-by: Arkadiusz Hiler <arkadiusz.hiler@intel.com>

Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>

One comment below.

> @@ -66,6 +66,16 @@ void intel_uc_sanitize_options(struct drm_i915_private *dev_priv)
>  		if (!i915.enable_guc_loading)
>  			i915.enable_guc_submission = 0;
>  	}
> +
> +	if (i915.enable_guc_loading) {
> +		if (HAS_HUC_UCODE(dev_priv))
> +			intel_huc_select_fw(&dev_priv->huc);
> +
> +		intel_guc_select_fw(&dev_priv->guc);
> +
> +		if (!dev_priv->guc.fw.path)
> +			i915.enable_guc_loading = 0;

Maybe make this (as suggested by Michal):

	if (intel_guc_select_fw(&dev_priv->guc) < 0)
		i915.enable_guc_loading = 0;

I think the select_fw is appropriate in this place once we introduce
the option to override the FW path, it'll part of sanitization.

Regards, Joonas
Arkadiusz Hiler March 2, 2017, 11:53 a.m. UTC | #3
On Fri, Feb 24, 2017 at 07:29:57PM +0100, Michal Wajdeczko wrote:
> On Fri, Feb 24, 2017 at 04:40:03PM +0100, Arkadiusz Hiler wrote:
> > intel_{h,g}uc_init_fw selects correct firmware and then triggers it's
> > preparation (fetch + initial parsing).
> > 
> > This change separates out select steps, so those can be called by
> > the sanitize_options().
> > 
> > Then, during the init_fw() we prepare the firmware if the firmware was
> > selected.
> > 
> > Cc: Michal Winiarski <michal.winiarski@intel.com>
> > Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
> > Signed-off-by: Arkadiusz Hiler <arkadiusz.hiler@intel.com>
> > ---
> 
> It looks strange that in one series you're changing function names
> or their logic few times ... patch ordering really matters ;)

Is this really that bad? I do not see that much disadvantage to the
current state.

I am seeing the series as a whole. Titles of the commits are pretty
informative (and you have them both in you email client when you are
viewing the whole thread, and in the cover letter) - e.g. you can see that
one of the later commits reworks firmware path handling, and can assume
that the previous changes to that code were intermediary (changing
argument it takes and removing one or two checks as they are now on the
level above).

As of the name changes - those follow a pattern.

If I went with the original name until the final change it looks
inconsistent, and quite probably someone would've commented on that.

If I have had used the final names straight away that would be simply
misleading (in case of intel_guc_init -> init_fw -> select_fw).

> Please consider reorder/squash.

I've tried to rebase with squashing and resplitting two times, and what
I came with was pretty similar to the current series.

But I might have hard-wired my brain to follow those exact steps,
therefore the repetition...

If you have any suggestion how to do that properly, keeping changes
small, logical and ordered please share. I'd love to learn how to make
my series less painful for future reviewers.
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/intel_guc_loader.c b/drivers/gpu/drm/i915/intel_guc_loader.c
index 64f50bd..8ccd832 100644
--- a/drivers/gpu/drm/i915/intel_guc_loader.c
+++ b/drivers/gpu/drm/i915/intel_guc_loader.c
@@ -467,15 +467,10 @@  int intel_guc_init_hw(struct drm_i915_private *dev_priv)
 }
 
 /**
- * intel_guc_init_fw() - select and prepare firmware for loading
+ * intel_guc_select_fw() - selects GuC firmware for loading
  * @guc:	intel_guc struct
- *
- * Called early during driver load, but after GEM is initialised.
- *
- * The firmware will be transferred to the GuC's memory later,
- * when intel_guc_init_hw() is called.
  */
-void intel_guc_init_fw(struct intel_guc *guc)
+void intel_guc_select_fw(struct intel_guc *guc)
 {
 	struct drm_i915_private *dev_priv = guc_to_i915(guc);
 
@@ -498,11 +493,8 @@  void intel_guc_init_fw(struct intel_guc *guc)
 		guc->fw.minor_ver_wanted = KBL_FW_MINOR;
 	} else {
 		DRM_ERROR("No GuC firmware known for platform with GuC!\n");
-		i915.enable_guc_loading = 0;
 		return;
 	}
-
-	intel_uc_prepare_fw(dev_priv, &guc->fw);
 }
 
 /**
diff --git a/drivers/gpu/drm/i915/intel_huc.c b/drivers/gpu/drm/i915/intel_huc.c
index 757f618..d073a68 100644
--- a/drivers/gpu/drm/i915/intel_huc.c
+++ b/drivers/gpu/drm/i915/intel_huc.c
@@ -141,18 +141,10 @@  static int huc_ucode_xfer(struct drm_i915_private *dev_priv)
 }
 
 /**
- * intel_huc_init_fw() - select and prepare firmware for loading
+ * intel_huc_select_fw() - selects HuC firmware for loading
  * @huc:	intel_huc struct
- *
- * Called early during driver load, but after GEM is initialised. The loading
- * will continue only when driver explicitly specify firmware name and version.
- * All other cases are considered as INTEL_UC_FIRMWARE_NONE either because HW
- * is not capable or driver yet support it. And there will be no error message
- * for INTEL_UC_FIRMWARE_NONE cases.
- *
- * The DMA-copying to HW is done later when intel_huc_init_hw() is called.
  */
-void intel_huc_init_fw(struct intel_huc *huc)
+void intel_huc_select_fw(struct intel_huc *huc)
 {
 	struct drm_i915_private *dev_priv = huc_to_i915(huc);
 
@@ -177,8 +169,6 @@  void intel_huc_init_fw(struct intel_huc *huc)
 		DRM_ERROR("No HuC firmware known for platform with HuC!\n");
 		return;
 	}
-
-	intel_uc_prepare_fw(dev_priv, &huc->fw);
 }
 
 /**
diff --git a/drivers/gpu/drm/i915/intel_uc.c b/drivers/gpu/drm/i915/intel_uc.c
index ac9ad59..89681b37 100644
--- a/drivers/gpu/drm/i915/intel_uc.c
+++ b/drivers/gpu/drm/i915/intel_uc.c
@@ -66,6 +66,16 @@  void intel_uc_sanitize_options(struct drm_i915_private *dev_priv)
 		if (!i915.enable_guc_loading)
 			i915.enable_guc_submission = 0;
 	}
+
+	if (i915.enable_guc_loading) {
+		if (HAS_HUC_UCODE(dev_priv))
+			intel_huc_select_fw(&dev_priv->huc);
+
+		intel_guc_select_fw(&dev_priv->guc);
+
+		if (!dev_priv->guc.fw.path)
+			i915.enable_guc_loading = 0;
+	}
 }
 
 void intel_uc_init_early(struct drm_i915_private *dev_priv)
@@ -75,13 +85,11 @@  void intel_uc_init_early(struct drm_i915_private *dev_priv)
 
 void intel_uc_init_fw(struct drm_i915_private *dev_priv)
 {
-	if (!i915.enable_guc_loading)
-		return;
+	if (dev_priv->huc.fw.path)
+		intel_uc_prepare_fw(dev_priv, &dev_priv->huc.fw);
 
-	if (HAS_HUC_UCODE(dev_priv))
-		intel_huc_init_fw(&dev_priv->huc);
-
-	intel_guc_init_fw(&dev_priv->guc);
+	if (dev_priv->guc.fw.path)
+		intel_uc_prepare_fw(dev_priv, &dev_priv->guc.fw);
 }
 
 int intel_uc_init_hw(struct drm_i915_private *dev_priv)
diff --git a/drivers/gpu/drm/i915/intel_uc.h b/drivers/gpu/drm/i915/intel_uc.h
index d19c95e..5f04ea1 100644
--- a/drivers/gpu/drm/i915/intel_uc.h
+++ b/drivers/gpu/drm/i915/intel_uc.h
@@ -194,7 +194,7 @@  void intel_uc_prepare_fw(struct drm_i915_private *dev_priv,
 			 struct intel_uc_fw *uc_fw);
 
 /* intel_guc_loader.c */
-void intel_guc_init_fw(struct intel_guc *guc);
+void intel_guc_select_fw(struct intel_guc *guc);
 int intel_guc_init_hw(struct drm_i915_private *dev_priv);
 void intel_guc_fini(struct drm_i915_private *dev_priv);
 const char *intel_uc_fw_status_repr(enum intel_uc_fw_status status);
@@ -230,7 +230,7 @@  static inline u32 guc_ggtt_offset(struct i915_vma *vma)
 }
 
 /* intel_huc.c */
-void intel_huc_init_fw(struct intel_huc *huc);
+void intel_huc_select_fw(struct intel_huc *huc);
 void intel_huc_fini(struct drm_i915_private  *dev_priv);
 int intel_huc_init_hw(struct drm_i915_private *dev_priv);
 void intel_guc_auth_huc(struct drm_i915_private *dev_priv);