[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