[Intel-gfx] [PATCH 2/9] drm/i915: Move uC fw helper code into dedicated files

Sagar Arun Kamble sagar.a.kamble at intel.com
Sat Sep 30 14:43:35 UTC 2017



On 9/30/2017 3:31 PM, Sagar Arun Kamble wrote:
>
>
> On 9/29/2017 11:11 PM, Michal Wajdeczko wrote:
>> This is a prerequisite to unblock next steps.
>> No functional changes, only s/dev_priv/i915
>>
>> Signed-off-by: Michal Wajdeczko <michal.wajdeczko at intel.com>
>> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
>> Cc: Chris Wilson <chris at chris-wilson.co.uk>
>> Cc: Sagar Arun Kamble <sagar.a.kamble at intel.com>
> Reviewed-by: Sagar Arun Kamble <sagar.a.kamble at intel.com>
Just realized that uC specific uc_css_header declaration is still 
present in intel_guc_fwif.h. is it good idea to pull this to intel_uc_fw.h?
>> ---
>>   drivers/gpu/drm/i915/Makefile      |   1 +
>>   drivers/gpu/drm/i915/intel_uc.c    | 163 
>> ++--------------------------------
>>   drivers/gpu/drm/i915/intel_uc.h    |  67 +-------------
>>   drivers/gpu/drm/i915/intel_uc_fw.c | 177 
>> +++++++++++++++++++++++++++++++++++++
>>   drivers/gpu/drm/i915/intel_uc_fw.h |  95 ++++++++++++++++++++
>>   5 files changed, 280 insertions(+), 223 deletions(-)
>>   create mode 100644 drivers/gpu/drm/i915/intel_uc_fw.c
>>   create mode 100644 drivers/gpu/drm/i915/intel_uc_fw.h
>>
>> diff --git a/drivers/gpu/drm/i915/Makefile 
>> b/drivers/gpu/drm/i915/Makefile
>> index 5182e3d..4850f26 100644
>> --- a/drivers/gpu/drm/i915/Makefile
>> +++ b/drivers/gpu/drm/i915/Makefile
>> @@ -59,6 +59,7 @@ i915-y += i915_cmd_parser.o \
>>     # general-purpose microcontroller (GuC) support
>>   i915-y += intel_uc.o \
>> +      intel_uc_fw.o \
>>         intel_guc_ct.o \
>>         intel_guc_log.o \
>>         intel_guc_loader.o \
>> diff --git a/drivers/gpu/drm/i915/intel_uc.c 
>> b/drivers/gpu/drm/i915/intel_uc.c
>> index 2774778..9426cc1 100644
>> --- a/drivers/gpu/drm/i915/intel_uc.c
>> +++ b/drivers/gpu/drm/i915/intel_uc.c
>> @@ -26,19 +26,6 @@
>>   #include "intel_uc.h"
>>   #include <linux/firmware.h>
>>   -/* Cleans up uC firmware by releasing the firmware GEM obj.
>> - */
>> -static void __intel_uc_fw_fini(struct intel_uc_fw *uc_fw)
>> -{
>> -    struct drm_i915_gem_object *obj;
>> -
>> -    obj = fetch_and_zero(&uc_fw->obj);
>> -    if (obj)
>> -        i915_gem_object_put(obj);
>> -
>> -    uc_fw->fetch_status = INTEL_UC_FIRMWARE_NONE;
>> -}
>> -
>>   /* Reset GuC providing us with fresh state for both GuC and HuC.
>>    */
>>   static int __intel_uc_reset_hw(struct drm_i915_private *dev_priv)
>> @@ -112,154 +99,16 @@ void intel_uc_init_early(struct 
>> drm_i915_private *dev_priv)
>>       guc->notify = gen8_guc_raise_irq;
>>   }
>>   -static void fetch_uc_fw(struct drm_i915_private *dev_priv,
>> -            struct intel_uc_fw *uc_fw)
>> -{
>> -    struct pci_dev *pdev = dev_priv->drm.pdev;
>> -    struct drm_i915_gem_object *obj;
>> -    const struct firmware *fw = NULL;
>> -    struct uc_css_header *css;
>> -    size_t size;
>> -    int err;
>> -
>> -    if (!uc_fw->path)
>> -        return;
>> -
>> -    uc_fw->fetch_status = INTEL_UC_FIRMWARE_PENDING;
>> -
>> -    DRM_DEBUG_DRIVER("before requesting firmware: uC fw fetch status 
>> %s\n",
>> -             intel_uc_fw_status_repr(uc_fw->fetch_status));
>> -
>> -    err = request_firmware(&fw, uc_fw->path, &pdev->dev);
>> -    if (err)
>> -        goto fail;
>> -    if (!fw)
>> -        goto fail;
>> -
>> -    DRM_DEBUG_DRIVER("fetch uC fw from %s succeeded, fw %p\n",
>> -             uc_fw->path, fw);
>> -
>> -    /* Check the size of the blob before examining buffer contents */
>> -    if (fw->size < sizeof(struct uc_css_header)) {
>> -        DRM_NOTE("Firmware header is missing\n");
>> -        goto fail;
>> -    }
>> -
>> -    css = (struct uc_css_header *)fw->data;
>> -
>> -    /* Firmware bits always start from header */
>> -    uc_fw->header_offset = 0;
>> -    uc_fw->header_size = (css->header_size_dw - css->modulus_size_dw -
>> -                  css->key_size_dw - css->exponent_size_dw) * 
>> sizeof(u32);
>> -
>> -    if (uc_fw->header_size != sizeof(struct uc_css_header)) {
>> -        DRM_NOTE("CSS header definition mismatch\n");
>> -        goto fail;
>> -    }
>> -
>> -    /* then, uCode */
>> -    uc_fw->ucode_offset = uc_fw->header_offset + uc_fw->header_size;
>> -    uc_fw->ucode_size = (css->size_dw - css->header_size_dw) * 
>> sizeof(u32);
>> -
>> -    /* now RSA */
>> -    if (css->key_size_dw != UOS_RSA_SCRATCH_MAX_COUNT) {
>> -        DRM_NOTE("RSA key size is bad\n");
>> -        goto fail;
>> -    }
>> -    uc_fw->rsa_offset = uc_fw->ucode_offset + uc_fw->ucode_size;
>> -    uc_fw->rsa_size = css->key_size_dw * sizeof(u32);
>> -
>> -    /* At least, it should have header, uCode and RSA. Size of all 
>> three. */
>> -    size = uc_fw->header_size + uc_fw->ucode_size + uc_fw->rsa_size;
>> -    if (fw->size < size) {
>> -        DRM_NOTE("Missing firmware components\n");
>> -        goto fail;
>> -    }
>> -
>> -    /*
>> -     * The GuC firmware image has the version number embedded at a
>> -     * well-known offset within the firmware blob; note that major / 
>> minor
>> -     * version are TWO bytes each (i.e. u16), although all pointers and
>> -     * offsets are defined in terms of bytes (u8).
>> -     */
>> -    switch (uc_fw->type) {
>> -    case INTEL_UC_FW_TYPE_GUC:
>> -        /* Header and uCode will be loaded to WOPCM. Size of the 
>> two. */
>> -        size = uc_fw->header_size + uc_fw->ucode_size;
>> -
>> -        /* Top 32k of WOPCM is reserved (8K stack + 24k RC6 
>> context). */
>> -        if (size > intel_guc_wopcm_size(dev_priv)) {
>> -            DRM_ERROR("Firmware is too large to fit in WOPCM\n");
>> -            goto fail;
>> -        }
>> -        uc_fw->major_ver_found = css->guc.sw_version >> 16;
>> -        uc_fw->minor_ver_found = css->guc.sw_version & 0xFFFF;
>> -        break;
>> -
>> -    case INTEL_UC_FW_TYPE_HUC:
>> -        uc_fw->major_ver_found = css->huc.sw_version >> 16;
>> -        uc_fw->minor_ver_found = css->huc.sw_version & 0xFFFF;
>> -        break;
>> -
>> -    default:
>> -        DRM_ERROR("Unknown firmware type %d\n", uc_fw->type);
>> -        err = -ENOEXEC;
>> -        goto fail;
>> -    }
>> -
>> -    if (uc_fw->major_ver_wanted == 0 && uc_fw->minor_ver_wanted == 0) {
>> -        DRM_NOTE("Skipping %s firmware version check\n",
>> -             intel_uc_fw_type_repr(uc_fw->type));
>> -    } else if (uc_fw->major_ver_found != uc_fw->major_ver_wanted ||
>> -           uc_fw->minor_ver_found < uc_fw->minor_ver_wanted) {
>> -        DRM_NOTE("%s firmware version %d.%d, required %d.%d\n",
>> -             intel_uc_fw_type_repr(uc_fw->type),
>> -             uc_fw->major_ver_found, uc_fw->minor_ver_found,
>> -             uc_fw->major_ver_wanted, uc_fw->minor_ver_wanted);
>> -        err = -ENOEXEC;
>> -        goto fail;
>> -    }
>> -
>> -    DRM_DEBUG_DRIVER("firmware version %d.%d OK (minimum %d.%d)\n",
>> -             uc_fw->major_ver_found, uc_fw->minor_ver_found,
>> -             uc_fw->major_ver_wanted, uc_fw->minor_ver_wanted);
>> -
>> -    obj = i915_gem_object_create_from_data(dev_priv, fw->data, 
>> fw->size);
>> -    if (IS_ERR(obj)) {
>> -        err = PTR_ERR(obj);
>> -        goto fail;
>> -    }
>> -
>> -    uc_fw->obj = obj;
>> -    uc_fw->size = fw->size;
>> -
>> -    DRM_DEBUG_DRIVER("uC fw fetch status SUCCESS, obj %p\n",
>> -             uc_fw->obj);
>> -
>> -    release_firmware(fw);
>> -    uc_fw->fetch_status = INTEL_UC_FIRMWARE_SUCCESS;
>> -    return;
>> -
>> -fail:
>> -    DRM_WARN("Failed to fetch valid uC firmware from %s (error %d)\n",
>> -         uc_fw->path, err);
>> -    DRM_DEBUG_DRIVER("uC fw fetch status FAIL; err %d, fw %p, obj 
>> %p\n",
>> -             err, fw, uc_fw->obj);
>> -
>> -    release_firmware(fw);        /* OK even if fw is NULL */
>> -    uc_fw->fetch_status = INTEL_UC_FIRMWARE_FAIL;
>> -}
>> -
>> -void intel_uc_init_fw(struct drm_i915_private *dev_priv)
>> +void intel_uc_init_fw(struct drm_i915_private *i915)
>>   {
>> -    fetch_uc_fw(dev_priv, &dev_priv->huc.fw);
>> -    fetch_uc_fw(dev_priv, &dev_priv->guc.fw);
>> +    i915_fetch_uc_fw(i915, &i915->huc.fw);
>> +    i915_fetch_uc_fw(i915, &i915->guc.fw);
>>   }
>>   -void intel_uc_fini_fw(struct drm_i915_private *dev_priv)
>> +void intel_uc_fini_fw(struct drm_i915_private *i915)
>>   {
>> -    __intel_uc_fw_fini(&dev_priv->guc.fw);
>> -    __intel_uc_fw_fini(&dev_priv->huc.fw);
>> +    intel_uc_fw_fini(&i915->guc.fw);
>> +    intel_uc_fw_fini(&i915->huc.fw);
>>   }
>>     static inline i915_reg_t guc_send_reg(struct intel_guc *guc, u32 i)
>> diff --git a/drivers/gpu/drm/i915/intel_uc.h 
>> b/drivers/gpu/drm/i915/intel_uc.h
>> index 38ec880..d111f79 100644
>> --- a/drivers/gpu/drm/i915/intel_uc.h
>> +++ b/drivers/gpu/drm/i915/intel_uc.h
>> @@ -24,6 +24,7 @@
>>   #ifndef _INTEL_UC_H_
>>   #define _INTEL_UC_H_
>>   +#include "intel_uc_fw.h"
>>   #include "intel_guc_fwif.h"
>>   #include "i915_guc_reg.h"
>>   #include "intel_ringbuffer.h"
>> @@ -70,72 +71,6 @@ struct i915_guc_client {
>>       uint64_t submissions[I915_NUM_ENGINES];
>>   };
>>   -enum intel_uc_fw_status {
>> -    INTEL_UC_FIRMWARE_FAIL = -1,
>> -    INTEL_UC_FIRMWARE_NONE = 0,
>> -    INTEL_UC_FIRMWARE_PENDING,
>> -    INTEL_UC_FIRMWARE_SUCCESS
>> -};
>> -
>> -/* User-friendly representation of an enum */
>> -static inline
>> -const char *intel_uc_fw_status_repr(enum intel_uc_fw_status status)
>> -{
>> -    switch (status) {
>> -    case INTEL_UC_FIRMWARE_FAIL:
>> -        return "FAIL";
>> -    case INTEL_UC_FIRMWARE_NONE:
>> -        return "NONE";
>> -    case INTEL_UC_FIRMWARE_PENDING:
>> -        return "PENDING";
>> -    case INTEL_UC_FIRMWARE_SUCCESS:
>> -        return "SUCCESS";
>> -    }
>> -    return "<invalid>";
>> -}
>> -
>> -enum intel_uc_fw_type {
>> -    INTEL_UC_FW_TYPE_GUC,
>> -    INTEL_UC_FW_TYPE_HUC
>> -};
>> -
>> -/* User-friendly representation of an enum */
>> -static inline const char *intel_uc_fw_type_repr(enum 
>> intel_uc_fw_type type)
>> -{
>> -    switch (type) {
>> -    case INTEL_UC_FW_TYPE_GUC:
>> -        return "GuC";
>> -    case INTEL_UC_FW_TYPE_HUC:
>> -        return "HuC";
>> -    }
>> -    return "uC";
>> -}
>> -
>> -/*
>> - * This structure encapsulates all the data needed during the process
>> - * of fetching, caching, and loading the firmware image into the GuC.
>> - */
>> -struct intel_uc_fw {
>> -    const char *path;
>> -    size_t size;
>> -    struct drm_i915_gem_object *obj;
>> -    enum intel_uc_fw_status fetch_status;
>> -    enum intel_uc_fw_status load_status;
>> -
>> -    uint16_t major_ver_wanted;
>> -    uint16_t minor_ver_wanted;
>> -    uint16_t major_ver_found;
>> -    uint16_t minor_ver_found;
>> -
>> -    enum intel_uc_fw_type type;
>> -    uint32_t header_size;
>> -    uint32_t header_offset;
>> -    uint32_t rsa_size;
>> -    uint32_t rsa_offset;
>> -    uint32_t ucode_size;
>> -    uint32_t ucode_offset;
>> -};
>> -
>>   struct intel_guc_log {
>>       uint32_t flags;
>>       struct i915_vma *vma;
>> diff --git a/drivers/gpu/drm/i915/intel_uc_fw.c 
>> b/drivers/gpu/drm/i915/intel_uc_fw.c
>> new file mode 100644
>> index 0000000..29920af
>> --- /dev/null
>> +++ b/drivers/gpu/drm/i915/intel_uc_fw.c
>> @@ -0,0 +1,177 @@
>> +/*
>> + * Copyright © 2016-2017 Intel Corporation
>> + *
>> + * Permission is hereby granted, free of charge, to any person 
>> obtaining a
>> + * copy of this software and associated documentation files (the 
>> "Software"),
>> + * to deal in the Software without restriction, including without 
>> limitation
>> + * the rights to use, copy, modify, merge, publish, distribute, 
>> sublicense,
>> + * and/or sell copies of the Software, and to permit persons to whom 
>> the
>> + * Software is furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice (including 
>> the next
>> + * paragraph) shall be included in all copies or substantial 
>> portions of the
>> + * Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
>> EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
>> MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO 
>> EVENT SHALL
>> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES 
>> OR OTHER
>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 
>> ARISING
>> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 
>> OTHER DEALINGS
>> + * IN THE SOFTWARE.
>> + *
>> + */
>> +
>> +#include <linux/firmware.h>
>> +#include "i915_drv.h"
>> +
>> +/* Cleans up uC firmware by releasing the firmware GEM obj.
>> + */
>> +void intel_uc_fw_fini(struct intel_uc_fw *uc_fw)
>> +{
>> +    struct drm_i915_gem_object *obj;
>> +
>> +    obj = fetch_and_zero(&uc_fw->obj);
>> +    if (obj)
>> +        i915_gem_object_put(obj);
>> +
>> +    uc_fw->fetch_status = INTEL_UC_FIRMWARE_NONE;
>> +}
>> +
>> +void i915_fetch_uc_fw(struct drm_i915_private *i915,
>> +              struct intel_uc_fw *uc_fw)
>> +{
>> +    struct pci_dev *pdev = i915->drm.pdev;
>> +    struct drm_i915_gem_object *obj;
>> +    const struct firmware *fw = NULL;
>> +    struct uc_css_header *css;
>> +    size_t size;
>> +    int err;
>> +
>> +    if (!uc_fw->path)
>> +        return;
>> +
>> +    uc_fw->fetch_status = INTEL_UC_FIRMWARE_PENDING;
>> +
>> +    DRM_DEBUG_DRIVER("before requesting firmware: uC fw fetch status 
>> %s\n",
>> +             intel_uc_fw_status_repr(uc_fw->fetch_status));
>> +
>> +    err = request_firmware(&fw, uc_fw->path, &pdev->dev);
>> +    if (err)
>> +        goto fail;
>> +    if (!fw)
>> +        goto fail;
>> +
>> +    DRM_DEBUG_DRIVER("fetch uC fw from %s succeeded, fw %p\n",
>> +             uc_fw->path, fw);
>> +
>> +    /* Check the size of the blob before examining buffer contents */
>> +    if (fw->size < sizeof(struct uc_css_header)) {
>> +        DRM_NOTE("Firmware header is missing\n");
>> +        goto fail;
>> +    }
>> +
>> +    css = (struct uc_css_header *)fw->data;
>> +
>> +    /* Firmware bits always start from header */
>> +    uc_fw->header_offset = 0;
>> +    uc_fw->header_size = (css->header_size_dw - css->modulus_size_dw -
>> +                  css->key_size_dw - css->exponent_size_dw) * 
>> sizeof(u32);
>> +
>> +    if (uc_fw->header_size != sizeof(struct uc_css_header)) {
>> +        DRM_NOTE("CSS header definition mismatch\n");
>> +        goto fail;
>> +    }
>> +
>> +    /* then, uCode */
>> +    uc_fw->ucode_offset = uc_fw->header_offset + uc_fw->header_size;
>> +    uc_fw->ucode_size = (css->size_dw - css->header_size_dw) * 
>> sizeof(u32);
>> +
>> +    /* now RSA */
>> +    if (css->key_size_dw != UOS_RSA_SCRATCH_MAX_COUNT) {
>> +        DRM_NOTE("RSA key size is bad\n");
>> +        goto fail;
>> +    }
>> +    uc_fw->rsa_offset = uc_fw->ucode_offset + uc_fw->ucode_size;
>> +    uc_fw->rsa_size = css->key_size_dw * sizeof(u32);
>> +
>> +    /* At least, it should have header, uCode and RSA. Size of all 
>> three. */
>> +    size = uc_fw->header_size + uc_fw->ucode_size + uc_fw->rsa_size;
>> +    if (fw->size < size) {
>> +        DRM_NOTE("Missing firmware components\n");
>> +        goto fail;
>> +    }
>> +
>> +    /*
>> +     * The GuC firmware image has the version number embedded at a
>> +     * well-known offset within the firmware blob; note that major / 
>> minor
>> +     * version are TWO bytes each (i.e. u16), although all pointers and
>> +     * offsets are defined in terms of bytes (u8).
>> +     */
>> +    switch (uc_fw->type) {
>> +    case INTEL_UC_FW_TYPE_GUC:
>> +        /* Header and uCode will be loaded to WOPCM. Size of the 
>> two. */
>> +        size = uc_fw->header_size + uc_fw->ucode_size;
>> +
>> +        /* Top 32k of WOPCM is reserved (8K stack + 24k RC6 
>> context). */
>> +        if (size > intel_guc_wopcm_size(i915)) {
>> +            DRM_ERROR("Firmware is too large to fit in WOPCM\n");
>> +            goto fail;
>> +        }
>> +        uc_fw->major_ver_found = css->guc.sw_version >> 16;
>> +        uc_fw->minor_ver_found = css->guc.sw_version & 0xFFFF;
>> +        break;
>> +
>> +    case INTEL_UC_FW_TYPE_HUC:
>> +        uc_fw->major_ver_found = css->huc.sw_version >> 16;
>> +        uc_fw->minor_ver_found = css->huc.sw_version & 0xFFFF;
>> +        break;
>> +
>> +    default:
>> +        DRM_ERROR("Unknown firmware type %d\n", uc_fw->type);
>> +        err = -ENOEXEC;
>> +        goto fail;
>> +    }
>> +
>> +    if (uc_fw->major_ver_wanted == 0 && uc_fw->minor_ver_wanted == 0) {
>> +        DRM_NOTE("Skipping %s firmware version check\n",
>> +             intel_uc_fw_type_repr(uc_fw->type));
>> +    } else if (uc_fw->major_ver_found != uc_fw->major_ver_wanted ||
>> +           uc_fw->minor_ver_found < uc_fw->minor_ver_wanted) {
>> +        DRM_NOTE("%s firmware version %d.%d, required %d.%d\n",
>> +             intel_uc_fw_type_repr(uc_fw->type),
>> +             uc_fw->major_ver_found, uc_fw->minor_ver_found,
>> +             uc_fw->major_ver_wanted, uc_fw->minor_ver_wanted);
>> +        err = -ENOEXEC;
>> +        goto fail;
>> +    }
>> +
>> +    DRM_DEBUG_DRIVER("firmware version %d.%d OK (minimum %d.%d)\n",
>> +             uc_fw->major_ver_found, uc_fw->minor_ver_found,
>> +             uc_fw->major_ver_wanted, uc_fw->minor_ver_wanted);
>> +
>> +    obj = i915_gem_object_create_from_data(i915, fw->data, fw->size);
>> +    if (IS_ERR(obj)) {
>> +        err = PTR_ERR(obj);
>> +        goto fail;
>> +    }
>> +
>> +    uc_fw->obj = obj;
>> +    uc_fw->size = fw->size;
>> +
>> +    DRM_DEBUG_DRIVER("uC fw fetch status SUCCESS, obj %p\n",
>> +             uc_fw->obj);
>> +
>> +    release_firmware(fw);
>> +    uc_fw->fetch_status = INTEL_UC_FIRMWARE_SUCCESS;
>> +    return;
>> +
>> +fail:
>> +    DRM_WARN("Failed to fetch valid uC firmware from %s (error %d)\n",
>> +         uc_fw->path, err);
>> +    DRM_DEBUG_DRIVER("uC fw fetch status FAIL; err %d, fw %p, obj 
>> %p\n",
>> +             err, fw, uc_fw->obj);
>> +
>> +    release_firmware(fw);        /* OK even if fw is NULL */
>> +    uc_fw->fetch_status = INTEL_UC_FIRMWARE_FAIL;
>> +}
>> diff --git a/drivers/gpu/drm/i915/intel_uc_fw.h 
>> b/drivers/gpu/drm/i915/intel_uc_fw.h
>> new file mode 100644
>> index 0000000..f07c41f
>> --- /dev/null
>> +++ b/drivers/gpu/drm/i915/intel_uc_fw.h
>> @@ -0,0 +1,95 @@
>> +/*
>> + * Copyright © 2014-2017 Intel Corporation
>> + *
>> + * Permission is hereby granted, free of charge, to any person 
>> obtaining a
>> + * copy of this software and associated documentation files (the 
>> "Software"),
>> + * to deal in the Software without restriction, including without 
>> limitation
>> + * the rights to use, copy, modify, merge, publish, distribute, 
>> sublicense,
>> + * and/or sell copies of the Software, and to permit persons to whom 
>> the
>> + * Software is furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice (including 
>> the next
>> + * paragraph) shall be included in all copies or substantial 
>> portions of the
>> + * Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
>> EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
>> MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO 
>> EVENT SHALL
>> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES 
>> OR OTHER
>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 
>> ARISING
>> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 
>> OTHER DEALINGS
>> + * IN THE SOFTWARE.
>> + *
>> + */
>> +#ifndef _INTEL_UC_FW_H_
>> +#define _INTEL_UC_FW_H_
>> +
>> +enum intel_uc_fw_status {
>> +    INTEL_UC_FIRMWARE_FAIL = -1,
>> +    INTEL_UC_FIRMWARE_NONE = 0,
>> +    INTEL_UC_FIRMWARE_PENDING,
>> +    INTEL_UC_FIRMWARE_SUCCESS
>> +};
>> +
>> +enum intel_uc_fw_type {
>> +    INTEL_UC_FW_TYPE_GUC,
>> +    INTEL_UC_FW_TYPE_HUC
>> +};
>> +
>> +/*
>> + * This structure encapsulates all the data needed during the process
>> + * of fetching, caching, and loading the firmware image into the uC.
>> + */
>> +struct intel_uc_fw {
>> +    const char *path;
>> +    size_t size;
>> +    struct drm_i915_gem_object *obj;
>> +    enum intel_uc_fw_status fetch_status;
>> +    enum intel_uc_fw_status load_status;
>> +
>> +    uint16_t major_ver_wanted;
>> +    uint16_t minor_ver_wanted;
>> +    uint16_t major_ver_found;
>> +    uint16_t minor_ver_found;
>> +
>> +    enum intel_uc_fw_type type;
>> +    uint32_t header_size;
>> +    uint32_t header_offset;
>> +    uint32_t rsa_size;
>> +    uint32_t rsa_offset;
>> +    uint32_t ucode_size;
>> +    uint32_t ucode_offset;
>> +};
>> +
>> +static inline
>> +const char *intel_uc_fw_status_repr(enum intel_uc_fw_status status)
>> +{
>> +    switch (status) {
>> +    case INTEL_UC_FIRMWARE_FAIL:
>> +        return "FAIL";
>> +    case INTEL_UC_FIRMWARE_NONE:
>> +        return "NONE";
>> +    case INTEL_UC_FIRMWARE_PENDING:
>> +        return "PENDING";
>> +    case INTEL_UC_FIRMWARE_SUCCESS:
>> +        return "SUCCESS";
>> +    }
>> +    return "<invalid>";
>> +}
>> +
>> +static inline const char *intel_uc_fw_type_repr(enum 
>> intel_uc_fw_type type)
>> +{
>> +    switch (type) {
>> +    case INTEL_UC_FW_TYPE_GUC:
>> +        return "GuC";
>> +    case INTEL_UC_FW_TYPE_HUC:
>> +        return "HuC";
>> +    }
>> +    return "uC";
>> +}
>> +
>> +void intel_uc_fw_fini(struct intel_uc_fw *uc_fw);
>> +void i915_fetch_uc_fw(struct drm_i915_private *i915,
>> +              struct intel_uc_fw *uc_fw);
>> +
>> +#endif
>



More information about the Intel-gfx mailing list