[Intel-gfx] [PATCH v2] drm/i915/huc: Don't try to check HuC status if it's not loaded
Michal Wajdeczko
michal.wajdeczko at intel.com
Mon May 20 10:24:37 UTC 2019
On Mon, 20 May 2019 11:35:26 +0200, Chris Wilson
<chris at chris-wilson.co.uk> wrote:
> Quoting Michal Wajdeczko (2019-05-19 22:50:43)
>> If we never attempted to load HuC firmware, or we already wedged
>> or reset GuC/HuC, then there is no reason to wake up the device
>> to check one bit in the register that will be for sure cleared.
>>
>> v2: check if HuC was enabled; subtle change in ABI
>> reuse hus_is_load helper
>>
>> Suggested-by: Chris Wilson <chris at chris-wilson.co.uk>
>> Signed-off-by: Michal Wajdeczko <michal.wajdeczko at intel.com>
>> Cc: Chris Wilson <chris at chris-wilson.co.uk>
>> Cc: Tony Ye <tony.ye at intel.com>
>> ---
>> drivers/gpu/drm/i915/intel_huc.c | 20 ++++++++++++--------
>> drivers/gpu/drm/i915/intel_huc.h | 5 +++++
>> 2 files changed, 17 insertions(+), 8 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/intel_huc.c
>> b/drivers/gpu/drm/i915/intel_huc.c
>> index 1ff1fb015e58..bfdebec1cfc8 100644
>> --- a/drivers/gpu/drm/i915/intel_huc.c
>> +++ b/drivers/gpu/drm/i915/intel_huc.c
>> @@ -113,7 +113,7 @@ int intel_huc_auth(struct intel_huc *huc)
>> u32 status;
>> int ret;
>>
>> - if (huc->fw.load_status != INTEL_UC_FIRMWARE_SUCCESS)
>> + if (!intel_huc_is_loaded(huc))
>> return -ENOEXEC;
>>
>> ret = intel_guc_auth_huc(guc,
>> @@ -150,21 +150,25 @@ int intel_huc_auth(struct intel_huc *huc)
>> * This function reads status register to verify if HuC
>> * firmware was successfully loaded.
>> *
>> - * Returns: 1 if HuC firmware is loaded and verified,
>> - * 0 if HuC firmware is not loaded and -ENODEV if HuC
>> - * is not present on this platform.
>> + * Returns: 1 if HuC firmware is loaded and verified, 0 if HuC
>> firmware is not
>> + * enabled, -ENOPKG if HuC firmware is not loaded and -ENODEV if HuC
>> is not
>> + * present on this platform.
>> */
>> int intel_huc_check_status(struct intel_huc *huc)
>> {
>> struct drm_i915_private *dev_priv = huc_to_i915(huc);
>> intel_wakeref_t wakeref;
>> - bool status = false;
>> + bool verified = false;
>>
>> if (!HAS_HUC(dev_priv))
>> return -ENODEV;
>>
>> - with_intel_runtime_pm(dev_priv, wakeref)
>> - status = I915_READ(HUC_STATUS2) & HUC_FW_VERIFIED;
>> + if (!USES_HUC(dev_priv))
>> + return 0;
>
> Hmm, EOPNOTSUPP here for the user disabled case?
I'm not sure that user disabled case shall be reported as error,
since it perfectly fits into legacy ABI 0="not loaded".
The only small change is that now 0="not loaded (not enabled by user)"
>
> Then
>
> if (!intel_huc_is_loaded(huc))
> return -ENOPKG;
>
> bool verified = false;
> with_intel_runtime_pm(dev_priv, wakeref)
> verified = I915_READ(HUC_STATUS2) & HUC_FW_VERIFIED;
> return verified.
>
> That keeps it a bit flatter with the special casing separate and the 0/1
> result as given by the register status. Then if negative, we know one of
> the preconditions for using HuC is not available, and if 0 something went
> wrong in mmio setup.
>
> Does that make sense?
IMHO, if something went wrong it is better to report it as error rather
then weak 0 status. Compare:
+---------------+-------+-------+-------+
no hardware -ENODEV -ENODEV -ENODEV
fw disabled 0 0 -ENOTSUP
fw not loaded 0 -ENOPKG -ENOPKG
fw not verified* 0 -ENOPKG 0
fw verified* 1 1 1
+---------------+-------+-------+-------+
*) registry access
Note that in your case, fw verification problem can be reported both
as -ENOPKG or as 0 (former when verification fails at load time, latter
as result of runtime reg read). Very likely we will never see 0 at all,
since probably that can't change once fw was verified at load time.
That might be viewed as undesired ABI change.
>
>> - return status;
>> + if (intel_huc_is_loaded(huc))
>> + with_intel_runtime_pm(dev_priv, wakeref)
>> + verified = I915_READ(HUC_STATUS2) &
>> HUC_FW_VERIFIED;
>> +
>> + return verified ? 1 : -ENOPKG;
>> }
>> diff --git a/drivers/gpu/drm/i915/intel_huc.h
>> b/drivers/gpu/drm/i915/intel_huc.h
>> index a0c21ae02a99..cde3d303718d 100644
>> --- a/drivers/gpu/drm/i915/intel_huc.h
>> +++ b/drivers/gpu/drm/i915/intel_huc.h
>> @@ -44,6 +44,11 @@ void intel_huc_fini(struct intel_huc *huc);
>> int intel_huc_auth(struct intel_huc *huc);
>> int intel_huc_check_status(struct intel_huc *huc);
>>
>> +static inline bool intel_huc_is_loaded(struct intel_huc *huc)
>> +{
>> + return intel_uc_fw_is_loaded(&huc->fw);
>> +}
>> +
>> static inline void intel_huc_fini_misc(struct intel_huc *huc)
>> {
>> intel_uc_fw_cleanup_fetch(&huc->fw);
>> --
>> 2.19.2
More information about the Intel-gfx
mailing list