linux/drivers/gpu/drm/i915/intel_uc_fw.h
<<
>>
Prefs
   1/*
   2 * Copyright © 2014-2017 Intel Corporation
   3 *
   4 * Permission is hereby granted, free of charge, to any person obtaining a
   5 * copy of this software and associated documentation files (the "Software"),
   6 * to deal in the Software without restriction, including without limitation
   7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   8 * and/or sell copies of the Software, and to permit persons to whom the
   9 * Software is furnished to do so, subject to the following conditions:
  10 *
  11 * The above copyright notice and this permission notice (including the next
  12 * paragraph) shall be included in all copies or substantial portions of the
  13 * Software.
  14 *
  15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  21 * IN THE SOFTWARE.
  22 *
  23 */
  24
  25#ifndef _INTEL_UC_FW_H_
  26#define _INTEL_UC_FW_H_
  27
  28struct drm_printer;
  29struct drm_i915_private;
  30
  31/* Home of GuC, HuC and DMC firmwares */
  32#define INTEL_UC_FIRMWARE_URL "https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/tree/i915"
  33
  34enum intel_uc_fw_status {
  35        INTEL_UC_FIRMWARE_FAIL = -1,
  36        INTEL_UC_FIRMWARE_NONE = 0,
  37        INTEL_UC_FIRMWARE_PENDING,
  38        INTEL_UC_FIRMWARE_SUCCESS
  39};
  40
  41enum intel_uc_fw_type {
  42        INTEL_UC_FW_TYPE_GUC,
  43        INTEL_UC_FW_TYPE_HUC
  44};
  45
  46/*
  47 * This structure encapsulates all the data needed during the process
  48 * of fetching, caching, and loading the firmware image into the uC.
  49 */
  50struct intel_uc_fw {
  51        const char *path;
  52        size_t size;
  53        struct drm_i915_gem_object *obj;
  54        enum intel_uc_fw_status fetch_status;
  55        enum intel_uc_fw_status load_status;
  56
  57        /*
  58         * The firmware build process will generate a version header file with major and
  59         * minor version defined. The versions are built into CSS header of firmware.
  60         * i915 kernel driver set the minimal firmware version required per platform.
  61         */
  62        u16 major_ver_wanted;
  63        u16 minor_ver_wanted;
  64        u16 major_ver_found;
  65        u16 minor_ver_found;
  66
  67        enum intel_uc_fw_type type;
  68        u32 header_size;
  69        u32 header_offset;
  70        u32 rsa_size;
  71        u32 rsa_offset;
  72        u32 ucode_size;
  73        u32 ucode_offset;
  74};
  75
  76static inline
  77const char *intel_uc_fw_status_repr(enum intel_uc_fw_status status)
  78{
  79        switch (status) {
  80        case INTEL_UC_FIRMWARE_FAIL:
  81                return "FAIL";
  82        case INTEL_UC_FIRMWARE_NONE:
  83                return "NONE";
  84        case INTEL_UC_FIRMWARE_PENDING:
  85                return "PENDING";
  86        case INTEL_UC_FIRMWARE_SUCCESS:
  87                return "SUCCESS";
  88        }
  89        return "<invalid>";
  90}
  91
  92static inline const char *intel_uc_fw_type_repr(enum intel_uc_fw_type type)
  93{
  94        switch (type) {
  95        case INTEL_UC_FW_TYPE_GUC:
  96                return "GuC";
  97        case INTEL_UC_FW_TYPE_HUC:
  98                return "HuC";
  99        }
 100        return "uC";
 101}
 102
 103static inline
 104void intel_uc_fw_init_early(struct intel_uc_fw *uc_fw,
 105                            enum intel_uc_fw_type type)
 106{
 107        uc_fw->path = NULL;
 108        uc_fw->fetch_status = INTEL_UC_FIRMWARE_NONE;
 109        uc_fw->load_status = INTEL_UC_FIRMWARE_NONE;
 110        uc_fw->type = type;
 111}
 112
 113static inline bool intel_uc_fw_is_selected(struct intel_uc_fw *uc_fw)
 114{
 115        return uc_fw->path != NULL;
 116}
 117
 118static inline bool intel_uc_fw_is_loaded(struct intel_uc_fw *uc_fw)
 119{
 120        return uc_fw->load_status == INTEL_UC_FIRMWARE_SUCCESS;
 121}
 122
 123static inline void intel_uc_fw_sanitize(struct intel_uc_fw *uc_fw)
 124{
 125        if (intel_uc_fw_is_loaded(uc_fw))
 126                uc_fw->load_status = INTEL_UC_FIRMWARE_PENDING;
 127}
 128
 129/**
 130 * intel_uc_fw_get_upload_size() - Get size of firmware needed to be uploaded.
 131 * @uc_fw: uC firmware.
 132 *
 133 * Get the size of the firmware and header that will be uploaded to WOPCM.
 134 *
 135 * Return: Upload firmware size, or zero on firmware fetch failure.
 136 */
 137static inline u32 intel_uc_fw_get_upload_size(struct intel_uc_fw *uc_fw)
 138{
 139        if (uc_fw->fetch_status != INTEL_UC_FIRMWARE_SUCCESS)
 140                return 0;
 141
 142        return uc_fw->header_size + uc_fw->ucode_size;
 143}
 144
 145void intel_uc_fw_fetch(struct drm_i915_private *dev_priv,
 146                       struct intel_uc_fw *uc_fw);
 147void intel_uc_fw_cleanup_fetch(struct intel_uc_fw *uc_fw);
 148int intel_uc_fw_upload(struct intel_uc_fw *uc_fw,
 149                       int (*xfer)(struct intel_uc_fw *uc_fw));
 150int intel_uc_fw_init(struct intel_uc_fw *uc_fw);
 151void intel_uc_fw_fini(struct intel_uc_fw *uc_fw);
 152u32 intel_uc_fw_ggtt_offset(struct intel_uc_fw *uc_fw);
 153void intel_uc_fw_dump(const struct intel_uc_fw *uc_fw, struct drm_printer *p);
 154
 155#endif
 156