Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d2be9f2f authored by Arkadiusz Hiler's avatar Arkadiusz Hiler Committed by Joonas Lahtinen
Browse files

drm/i915/guc: Extract param logic form guc_init_fw()



Let intel_guc_init_fw() focus on determining and fetching the correct
firmware.

This patch introduces intel_uc_sanitize_options() that is called from
intel_sanitize_options().

Then, if we have GuC, we can call intel_guc_init_fw() conditionally
and we do not have to do the internal checks.

v2: fix comment, notify when nuking GuC explicitly enabled (M. Wajdeczko)
v3: fix comment again, change the nuke message (M. Wajdeczko)
v4: update title to reflect new function name + rebase
v5: text && remove 2 uneccessary checks (M. Wajdeczko)

Cc: Michal Winiarski <michal.winiarski@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: default avatarArkadiusz Hiler <arkadiusz.hiler@intel.com>
Reviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
parent 29ad6a30
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -988,6 +988,8 @@ static void intel_sanitize_options(struct drm_i915_private *dev_priv)


	i915.semaphores = intel_sanitize_semaphores(dev_priv, i915.semaphores);
	i915.semaphores = intel_sanitize_semaphores(dev_priv, i915.semaphores);
	DRM_DEBUG_DRIVER("use GPU semaphores? %s\n", yesno(i915.semaphores));
	DRM_DEBUG_DRIVER("use GPU semaphores? %s\n", yesno(i915.semaphores));

	intel_uc_sanitize_options(dev_priv);
}
}


/**
/**
+1 −17
Original line number Original line Diff line number Diff line
@@ -534,20 +534,7 @@ void intel_guc_init_fw(struct intel_guc *guc)
	struct drm_i915_private *dev_priv = guc_to_i915(guc);
	struct drm_i915_private *dev_priv = guc_to_i915(guc);
	const char *fw_path;
	const char *fw_path;


	if (!HAS_GUC(dev_priv)) {
	if (IS_SKYLAKE(dev_priv)) {
		i915.enable_guc_loading = 0;
		i915.enable_guc_submission = 0;
	} else {
		/* A negative value means "use platform default" */
		if (i915.enable_guc_loading < 0)
			i915.enable_guc_loading = HAS_GUC_UCODE(dev_priv);
		if (i915.enable_guc_submission < 0)
			i915.enable_guc_submission = HAS_GUC_SCHED(dev_priv);
	}

	if (!HAS_GUC_UCODE(dev_priv)) {
		fw_path = NULL;
	} else if (IS_SKYLAKE(dev_priv)) {
		fw_path = I915_SKL_GUC_UCODE;
		fw_path = I915_SKL_GUC_UCODE;
		guc->fw.major_ver_wanted = SKL_FW_MAJOR;
		guc->fw.major_ver_wanted = SKL_FW_MAJOR;
		guc->fw.minor_ver_wanted = SKL_FW_MINOR;
		guc->fw.minor_ver_wanted = SKL_FW_MINOR;
@@ -567,9 +554,6 @@ void intel_guc_init_fw(struct intel_guc *guc)
	guc->fw.fetch_status = INTEL_UC_FIRMWARE_NONE;
	guc->fw.fetch_status = INTEL_UC_FIRMWARE_NONE;
	guc->fw.load_status = INTEL_UC_FIRMWARE_NONE;
	guc->fw.load_status = INTEL_UC_FIRMWARE_NONE;


	/* Early (and silent) return if GuC loading is disabled */
	if (!i915.enable_guc_loading)
		return;
	if (fw_path == NULL)
	if (fw_path == NULL)
		return;
		return;
	if (*fw_path == '\0')
	if (*fw_path == '\0')
+0 −3
Original line number Original line Diff line number Diff line
@@ -162,9 +162,6 @@ void intel_huc_init_fw(struct intel_huc *huc)
	huc->fw.load_status = INTEL_UC_FIRMWARE_NONE;
	huc->fw.load_status = INTEL_UC_FIRMWARE_NONE;
	huc->fw.fw = INTEL_UC_FW_TYPE_HUC;
	huc->fw.fw = INTEL_UC_FW_TYPE_HUC;


	if (!HAS_HUC_UCODE(dev_priv))
		return;

	if (IS_SKYLAKE(dev_priv)) {
	if (IS_SKYLAKE(dev_priv)) {
		fw_path = I915_SKL_HUC_UCODE;
		fw_path = I915_SKL_HUC_UCODE;
		huc->fw.major_ver_wanted = SKL_HUC_FW_MAJOR;
		huc->fw.major_ver_wanted = SKL_HUC_FW_MAJOR;
+27 −1
Original line number Original line Diff line number Diff line
@@ -26,6 +26,27 @@
#include "intel_uc.h"
#include "intel_uc.h"
#include <linux/firmware.h>
#include <linux/firmware.h>


void intel_uc_sanitize_options(struct drm_i915_private *dev_priv)
{
	if (!HAS_GUC(dev_priv)) {
		if (i915.enable_guc_loading > 0)
			DRM_INFO("Ignoring GuC options, no hardware");

		i915.enable_guc_loading = 0;
		i915.enable_guc_submission = 0;
	} else {
		/* A negative value means "use platform default" */
		if (i915.enable_guc_loading < 0)
			i915.enable_guc_loading = HAS_GUC_UCODE(dev_priv);
		if (i915.enable_guc_submission < 0)
			i915.enable_guc_submission = HAS_GUC_SCHED(dev_priv);

		/* Can't enable guc submission without guc loaded */
		if (!i915.enable_guc_loading)
			i915.enable_guc_submission = 0;
	}
}

void intel_uc_init_early(struct drm_i915_private *dev_priv)
void intel_uc_init_early(struct drm_i915_private *dev_priv)
{
{
	mutex_init(&dev_priv->guc.send_mutex);
	mutex_init(&dev_priv->guc.send_mutex);
@@ -33,7 +54,12 @@ void intel_uc_init_early(struct drm_i915_private *dev_priv)


void intel_uc_init_fw(struct drm_i915_private *dev_priv)
void intel_uc_init_fw(struct drm_i915_private *dev_priv)
{
{
	if (!i915.enable_guc_loading)
		return;

	if (HAS_HUC_UCODE(dev_priv))
		intel_huc_init_fw(&dev_priv->huc);
		intel_huc_init_fw(&dev_priv->huc);

	intel_guc_init_fw(&dev_priv->guc);
	intel_guc_init_fw(&dev_priv->guc);
}
}


+1 −0
Original line number Original line Diff line number Diff line
@@ -184,6 +184,7 @@ struct intel_huc {
};
};


/* intel_uc.c */
/* intel_uc.c */
void intel_uc_sanitize_options(struct drm_i915_private *dev_priv);
void intel_uc_init_early(struct drm_i915_private *dev_priv);
void intel_uc_init_early(struct drm_i915_private *dev_priv);
void intel_uc_init_fw(struct drm_i915_private *dev_priv);
void intel_uc_init_fw(struct drm_i915_private *dev_priv);
void intel_uc_prepare_fw(struct drm_i915_private *dev_priv,
void intel_uc_prepare_fw(struct drm_i915_private *dev_priv,