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

Commit 356c4848 authored by Michal Wajdeczko's avatar Michal Wajdeczko Committed by Chris Wilson
Browse files

drm/i915/uc: Add explicit DISABLED state for firmware



We really need to have separate NOT_SUPPORTED state (for
lack of hardware support) and DISABLED state (to indicate
user decision) as we will have to take special steps even
if GuC firmware is now disabled but hardware exists and
could have been previously used.

v2: fix logic (Chris/CI)
v3: use proper check to avoid probe failure (CI)
v4: explain status transitions (Chris)

Signed-off-by: default avatarMichal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20190816205658.15020-1-michal.wajdeczko@intel.com
parent 4cb3b44d
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -154,7 +154,12 @@ struct i915_vma *intel_guc_allocate_vma(struct intel_guc *guc, u32 size);

static inline bool intel_guc_is_supported(struct intel_guc *guc)
{
	return intel_uc_fw_supported(&guc->fw);
	return intel_uc_fw_is_supported(&guc->fw);
}

static inline bool intel_guc_is_enabled(struct intel_guc *guc)
{
	return intel_uc_fw_is_enabled(&guc->fw);
}

static inline bool intel_guc_is_running(struct intel_guc *guc)
+6 −1
Original line number Diff line number Diff line
@@ -38,7 +38,12 @@ static inline int intel_huc_sanitize(struct intel_huc *huc)

static inline bool intel_huc_is_supported(struct intel_huc *huc)
{
	return intel_uc_fw_supported(&huc->fw);
	return intel_uc_fw_is_supported(&huc->fw);
}

static inline bool intel_huc_is_enabled(struct intel_huc *huc)
{
	return intel_uc_fw_is_enabled(&huc->fw);
}

static inline bool intel_huc_is_authenticated(struct intel_huc *huc)
+1 −1
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@ void intel_huc_fw_init_early(struct intel_huc *huc)
	struct drm_i915_private *i915 = gt->i915;

	intel_uc_fw_init_early(&huc->fw, INTEL_UC_FW_TYPE_HUC,
			       intel_uc_supports_guc(uc),
			       intel_uc_uses_guc(uc),
			       INTEL_INFO(i915)->platform, INTEL_REVID(i915));
}

+20 −17
Original line number Diff line number Diff line
@@ -45,17 +45,17 @@ static void __confirm_options(struct intel_uc *uc)
	DRM_DEV_DEBUG_DRIVER(i915->drm.dev,
			     "enable_guc=%d (guc:%s submission:%s huc:%s)\n",
			     i915_modparams.enable_guc,
			     yesno(intel_uc_supports_guc(uc)),
			     yesno(intel_uc_supports_guc_submission(uc)),
			     yesno(intel_uc_supports_huc(uc)));
			     yesno(intel_uc_uses_guc(uc)),
			     yesno(intel_uc_uses_guc_submission(uc)),
			     yesno(intel_uc_uses_huc(uc)));

	if (i915_modparams.enable_guc == -1)
		return;

	if (i915_modparams.enable_guc == 0) {
		GEM_BUG_ON(intel_uc_supports_guc(uc));
		GEM_BUG_ON(intel_uc_supports_guc_submission(uc));
		GEM_BUG_ON(intel_uc_supports_huc(uc));
		GEM_BUG_ON(intel_uc_uses_guc(uc));
		GEM_BUG_ON(intel_uc_uses_guc_submission(uc));
		GEM_BUG_ON(intel_uc_uses_huc(uc));
		return;
	}

@@ -266,23 +266,23 @@ void intel_uc_fetch_firmwares(struct intel_uc *uc)
	struct drm_i915_private *i915 = uc_to_gt(uc)->i915;
	int err;

	if (!intel_uc_supports_guc(uc))
	if (!intel_uc_uses_guc(uc))
		return;

	err = intel_uc_fw_fetch(&uc->guc.fw, i915);
	if (err)
		return;

	if (intel_uc_supports_huc(uc))
	if (intel_uc_uses_huc(uc))
		intel_uc_fw_fetch(&uc->huc.fw, i915);
}

void intel_uc_cleanup_firmwares(struct intel_uc *uc)
{
	if (!intel_uc_supports_guc(uc))
	if (!intel_uc_uses_guc(uc))
		return;

	if (intel_uc_supports_huc(uc))
	if (intel_uc_uses_huc(uc))
		intel_uc_fw_cleanup_fetch(&uc->huc.fw);

	intel_uc_fw_cleanup_fetch(&uc->guc.fw);
@@ -294,7 +294,7 @@ int intel_uc_init(struct intel_uc *uc)
	struct intel_huc *huc = &uc->huc;
	int ret;

	if (!intel_uc_supports_guc(uc))
	if (!intel_uc_uses_guc(uc))
		return 0;

	/* XXX: GuC submission is unavailable for now */
@@ -304,7 +304,7 @@ int intel_uc_init(struct intel_uc *uc)
	if (ret)
		return ret;

	if (intel_uc_supports_huc(uc)) {
	if (intel_uc_uses_huc(uc)) {
		ret = intel_huc_init(huc);
		if (ret)
			goto out_huc;
@@ -321,10 +321,10 @@ void intel_uc_fini(struct intel_uc *uc)
{
	struct intel_guc *guc = &uc->guc;

	if (!intel_uc_supports_guc(uc))
	if (!intel_uc_uses_guc(uc))
		return;

	if (intel_uc_supports_huc(uc))
	if (intel_uc_uses_huc(uc))
		intel_huc_fini(&uc->huc);

	intel_guc_fini(guc);
@@ -360,7 +360,7 @@ static int uc_init_wopcm(struct intel_uc *uc)
	struct intel_uncore *uncore = gt->uncore;
	u32 base = intel_wopcm_guc_base(&gt->i915->wopcm);
	u32 size = intel_wopcm_guc_size(&gt->i915->wopcm);
	u32 huc_agent = intel_uc_supports_huc(uc) ? HUC_LOADING_AGENT_GUC : 0;
	u32 huc_agent = intel_uc_uses_huc(uc) ? HUC_LOADING_AGENT_GUC : 0;
	u32 mask;
	int err;

@@ -417,6 +417,9 @@ int intel_uc_init_hw(struct intel_uc *uc)
	if (!intel_uc_supports_guc(uc))
		return 0;

	if (!intel_uc_uses_guc(uc))
		return 0;

	if (!intel_uc_fw_is_available(&guc->fw)) {
		ret = intel_uc_fw_status_to_error(guc->fw.status);
		goto err_out;
@@ -444,7 +447,7 @@ int intel_uc_init_hw(struct intel_uc *uc)
		if (ret)
			goto err_out;

		if (intel_uc_supports_huc(uc)) {
		if (intel_uc_uses_huc(uc)) {
			ret = intel_huc_fw_upload(huc);
			if (ret && intel_uc_fw_is_overridden(&huc->fw))
				goto err_out;
@@ -490,7 +493,7 @@ int intel_uc_init_hw(struct intel_uc *uc)
		 "submission",
		 enableddisabled(intel_uc_supports_guc_submission(uc)));

	if (intel_uc_supports_huc(uc)) {
	if (intel_uc_uses_huc(uc)) {
		dev_info(i915->drm.dev, "%s firmware %s version %u.%u %s:%s\n",
			 intel_uc_fw_type_repr(INTEL_UC_FW_TYPE_HUC),
			 huc->fw.path,
+16 −1
Original line number Diff line number Diff line
@@ -39,14 +39,29 @@ static inline bool intel_uc_supports_guc(struct intel_uc *uc)
	return intel_guc_is_supported(&uc->guc);
}

static inline bool intel_uc_uses_guc(struct intel_uc *uc)
{
	return intel_guc_is_enabled(&uc->guc);
}

static inline bool intel_uc_supports_guc_submission(struct intel_uc *uc)
{
	return intel_guc_is_submission_supported(&uc->guc);
}

static inline bool intel_uc_uses_guc_submission(struct intel_uc *uc)
{
	return intel_guc_is_submission_supported(&uc->guc);
}

static inline bool intel_uc_supports_huc(struct intel_uc *uc)
{
	return intel_huc_is_supported(&uc->huc);
	return intel_uc_supports_guc(uc);
}

static inline bool intel_uc_uses_huc(struct intel_uc *uc)
{
	return intel_huc_is_enabled(&uc->huc);
}

#endif
Loading