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