[Intel-gfx] [PATCH] drm/i915/huc: Check HuC status in dedicated function

Michel Thierry michel.thierry at intel.com
Wed Mar 14 23:34:33 UTC 2018


On 14/03/18 15:23, Michal Wajdeczko wrote:
> On Wed, 14 Mar 2018 21:17:29 +0100, Michel Thierry 
> <michel.thierry at intel.com> wrote:
> 
>> On 14/03/18 13:04, Michal Wajdeczko wrote:
>>> We try to keep all HuC related code in dedicated file.
>>> There is no need to peek HuC register directly during
>>> handling getparam ioctl.
>>>  Signed-off-by: Michal Wajdeczko <michal.wajdeczko at intel.com>
>>> Cc: Michel Thierry <michel.thierry at intel.com>
>>> Cc: Rodrigo Vivi <rodrigo.vivi at intel.com>
>>> Cc: Anusha Srivatsa <anusha.srivatsa at intel.com>
>>> ---
>>>   drivers/gpu/drm/i915/i915_drv.c  |  6 +++---
>>>   drivers/gpu/drm/i915/intel_huc.c | 25 +++++++++++++++++++++++++
>>>   drivers/gpu/drm/i915/intel_huc.h |  1 +
>>>   3 files changed, 29 insertions(+), 3 deletions(-)
>>>  diff --git a/drivers/gpu/drm/i915/i915_drv.c 
>>> b/drivers/gpu/drm/i915/i915_drv.c
>>> index f03555e..a902e88 100644
>>> --- a/drivers/gpu/drm/i915/i915_drv.c
>>> +++ b/drivers/gpu/drm/i915/i915_drv.c
>>> @@ -377,9 +377,9 @@ static int i915_getparam_ioctl(struct drm_device 
>>> *dev, void *data,
>>>           value = INTEL_INFO(dev_priv)->sseu.min_eu_in_pool;
>>>           break;
>>>       case I915_PARAM_HUC_STATUS:
>>> -        intel_runtime_pm_get(dev_priv);
>>> -        value = I915_READ(HUC_STATUS2) & HUC_FW_VERIFIED;
>>> -        intel_runtime_pm_put(dev_priv);
>>> +        value = intel_huc_check_status(&dev_priv->huc);
>>> +        if (value < 0)
>>> +            return value;
>>>           break;
>>>       case I915_PARAM_MMAP_GTT_VERSION:
>>>           /* Though we've started our numbering from 1, and so class all
>>> diff --git a/drivers/gpu/drm/i915/intel_huc.c 
>>> b/drivers/gpu/drm/i915/intel_huc.c
>>> index 1d6c47b..2912852 100644
>>> --- a/drivers/gpu/drm/i915/intel_huc.c
>>> +++ b/drivers/gpu/drm/i915/intel_huc.c
>>> @@ -92,3 +92,28 @@ int intel_huc_auth(struct intel_huc *huc)
>>>       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.
>>
>> Before if huc was not loaded, get_param would just return 0 and the 
>> ioctl call would be OK.
> 
> There is another potential problem, as in case HuC was loaded, this
> getparam would return specific bit from register instead of predefined
> value that shall indicate "loaded/verified" like "1".
> What if this bit from register will be moved on future platforms?

Really? ;)
I once heard someone claiming he had talked with the hw team and they've 
agreed not to randomly shuffle register specifications
(please laugh with me).

> Should we still return this old one?
> 
>> Maybe there's a test somewhere that would break?
> 
> I hope not, and given above concern, I assume we can still modify it.
> Is there any documentation what to expect from this getparam?
> 

And the media driver would survive the change [1] if that's what we care 
about.

But is the response from getparam ABI? I would say just 
drm_i915_getparam_t is.

[1] 
https://github.com/intel/media-driver/blob/c0321bc88e12247d21fa2d0b470cff841c3712ba/media_driver/linux/common/os/hwinfo_linux.c#L254

>> (I'm not arguing -ENODEV is better).
> 
> In all other places (like debugfs) we return -ENODEV if user wants
> to access HuC data on platform without HuC, so I think we should be
> consistent.
> 

sorry, a missing comma... I was agreeing with you:
 >> (I'm not arguing, -ENODEV is better).


>>
>> Otherwise,
>>
>> Reviewed-by: Michel Thierry <michel.thierry at intel.com>
>>
>>> + */
>>> +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;
>>> +}
>>> diff --git a/drivers/gpu/drm/i915/intel_huc.h 
>>> b/drivers/gpu/drm/i915/intel_huc.h
>>> index b185850..aa85490 100644
>>> --- a/drivers/gpu/drm/i915/intel_huc.h
>>> +++ b/drivers/gpu/drm/i915/intel_huc.h
>>> @@ -37,6 +37,7 @@ struct intel_huc {
>>>     void intel_huc_init_early(struct intel_huc *huc);
>>>   int intel_huc_auth(struct intel_huc *huc);
>>> +int intel_huc_check_status(struct intel_huc *huc);
>>>     static inline int intel_huc_sanitize(struct intel_huc *huc)
>>>   {


More information about the Intel-gfx mailing list