diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_huc.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_huc.c | 30 | 
1 files changed, 28 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/intel_huc.c b/drivers/gpu/drm/i915/intel_huc.c index 65e2afb9b955..291285277403 100644 --- a/drivers/gpu/drm/i915/intel_huc.c +++ b/drivers/gpu/drm/i915/intel_huc.c @@ -55,7 +55,7 @@ int intel_huc_auth(struct intel_huc *huc)  		return -ENOEXEC;  	vma = i915_gem_object_ggtt_pin(huc->fw.obj, NULL, 0, 0, -				PIN_OFFSET_BIAS | GUC_WOPCM_TOP); +				       PIN_OFFSET_BIAS | guc->ggtt_pin_bias);  	if (IS_ERR(vma)) {  		ret = PTR_ERR(vma);  		DRM_ERROR("HuC: Failed to pin huc fw object %d\n", ret); @@ -63,7 +63,8 @@ int intel_huc_auth(struct intel_huc *huc)  	}  	ret = intel_guc_auth_huc(guc, -				 guc_ggtt_offset(vma) + huc->fw.rsa_offset); +				 intel_guc_ggtt_offset(guc, vma) + +				 huc->fw.rsa_offset);  	if (ret) {  		DRM_ERROR("HuC: GuC did not ack Auth request %d\n", ret);  		goto fail_unpin; @@ -91,3 +92,28 @@ fail:  	DRM_ERROR("HuC: Authentication failed %d\n", ret);  	return ret;  } + +/** + * intel_huc_check_status() - check HuC status + * @huc: intel_huc structure + * + * This function reads status register to verify if HuC + * firmware was successfully loaded. + * + * Returns positive value if HuC firmware is loaded and verified + * and -ENODEV if HuC is not present. + */ +int intel_huc_check_status(struct intel_huc *huc) +{ +	struct drm_i915_private *dev_priv = huc_to_i915(huc); +	u32 status; + +	if (!HAS_HUC(dev_priv)) +		return -ENODEV; + +	intel_runtime_pm_get(dev_priv); +	status = I915_READ(HUC_STATUS2) & HUC_FW_VERIFIED; +	intel_runtime_pm_put(dev_priv); + +	return status; +}  |