1 /* SPDX-License-Identifier: MIT */ 2 /* 3 * Copyright © 2022 Intel Corporation 4 */ 5 6 #ifndef _XE_UC_FW_H_ 7 #define _XE_UC_FW_H_ 8 9 #include <linux/errno.h> 10 11 #include "xe_macros.h" 12 #include "xe_uc_fw_abi.h" 13 #include "xe_uc_fw_types.h" 14 15 struct drm_printer; 16 17 int xe_uc_fw_init(struct xe_uc_fw *uc_fw); 18 size_t xe_uc_fw_copy_rsa(struct xe_uc_fw *uc_fw, void *dst, u32 max_len); 19 int xe_uc_fw_upload(struct xe_uc_fw *uc_fw, u32 offset, u32 dma_flags); 20 int xe_uc_fw_check_version_requirements(struct xe_uc_fw *uc_fw); 21 void xe_uc_fw_print(struct xe_uc_fw *uc_fw, struct drm_printer *p); 22 23 static inline u32 xe_uc_fw_rsa_offset(struct xe_uc_fw *uc_fw) 24 { 25 return sizeof(struct uc_css_header) + uc_fw->ucode_size + uc_fw->css_offset; 26 } 27 28 static inline void xe_uc_fw_change_status(struct xe_uc_fw *uc_fw, 29 enum xe_uc_fw_status status) 30 { 31 uc_fw->__status = status; 32 } 33 34 static inline 35 const char *xe_uc_fw_status_repr(enum xe_uc_fw_status status) 36 { 37 switch (status) { 38 case XE_UC_FIRMWARE_NOT_SUPPORTED: 39 return "N/A"; 40 case XE_UC_FIRMWARE_UNINITIALIZED: 41 return "UNINITIALIZED"; 42 case XE_UC_FIRMWARE_DISABLED: 43 return "DISABLED"; 44 case XE_UC_FIRMWARE_SELECTED: 45 return "SELECTED"; 46 case XE_UC_FIRMWARE_MISSING: 47 return "MISSING"; 48 case XE_UC_FIRMWARE_ERROR: 49 return "ERROR"; 50 case XE_UC_FIRMWARE_AVAILABLE: 51 return "AVAILABLE"; 52 case XE_UC_FIRMWARE_INIT_FAIL: 53 return "INIT FAIL"; 54 case XE_UC_FIRMWARE_LOADABLE: 55 return "LOADABLE"; 56 case XE_UC_FIRMWARE_LOAD_FAIL: 57 return "LOAD FAIL"; 58 case XE_UC_FIRMWARE_TRANSFERRED: 59 return "TRANSFERRED"; 60 case XE_UC_FIRMWARE_RUNNING: 61 return "RUNNING"; 62 } 63 return "<invalid>"; 64 } 65 66 static inline int xe_uc_fw_status_to_error(enum xe_uc_fw_status status) 67 { 68 switch (status) { 69 case XE_UC_FIRMWARE_NOT_SUPPORTED: 70 return -ENODEV; 71 case XE_UC_FIRMWARE_UNINITIALIZED: 72 return -EACCES; 73 case XE_UC_FIRMWARE_DISABLED: 74 return -EPERM; 75 case XE_UC_FIRMWARE_MISSING: 76 return -ENOENT; 77 case XE_UC_FIRMWARE_ERROR: 78 return -ENOEXEC; 79 case XE_UC_FIRMWARE_INIT_FAIL: 80 case XE_UC_FIRMWARE_LOAD_FAIL: 81 return -EIO; 82 case XE_UC_FIRMWARE_SELECTED: 83 return -ESTALE; 84 case XE_UC_FIRMWARE_AVAILABLE: 85 case XE_UC_FIRMWARE_LOADABLE: 86 case XE_UC_FIRMWARE_TRANSFERRED: 87 case XE_UC_FIRMWARE_RUNNING: 88 return 0; 89 } 90 return -EINVAL; 91 } 92 93 static inline const char *xe_uc_fw_type_repr(enum xe_uc_fw_type type) 94 { 95 switch (type) { 96 case XE_UC_FW_TYPE_GUC: 97 return "GuC"; 98 case XE_UC_FW_TYPE_HUC: 99 return "HuC"; 100 case XE_UC_FW_TYPE_GSC: 101 return "GSC"; 102 default: 103 return "uC"; 104 } 105 } 106 107 static inline enum xe_uc_fw_status 108 __xe_uc_fw_status(struct xe_uc_fw *uc_fw) 109 { 110 /* shouldn't call this before checking hw/blob availability */ 111 XE_WARN_ON(uc_fw->status == XE_UC_FIRMWARE_UNINITIALIZED); 112 return uc_fw->status; 113 } 114 115 static inline bool xe_uc_fw_is_supported(struct xe_uc_fw *uc_fw) 116 { 117 return __xe_uc_fw_status(uc_fw) != XE_UC_FIRMWARE_NOT_SUPPORTED; 118 } 119 120 static inline bool xe_uc_fw_is_enabled(struct xe_uc_fw *uc_fw) 121 { 122 return __xe_uc_fw_status(uc_fw) > XE_UC_FIRMWARE_DISABLED; 123 } 124 125 static inline bool xe_uc_fw_is_disabled(struct xe_uc_fw *uc_fw) 126 { 127 return __xe_uc_fw_status(uc_fw) == XE_UC_FIRMWARE_DISABLED; 128 } 129 130 static inline bool xe_uc_fw_is_available(struct xe_uc_fw *uc_fw) 131 { 132 return __xe_uc_fw_status(uc_fw) >= XE_UC_FIRMWARE_AVAILABLE; 133 } 134 135 static inline bool xe_uc_fw_is_loadable(struct xe_uc_fw *uc_fw) 136 { 137 return __xe_uc_fw_status(uc_fw) >= XE_UC_FIRMWARE_LOADABLE; 138 } 139 140 static inline bool xe_uc_fw_is_loaded(struct xe_uc_fw *uc_fw) 141 { 142 return __xe_uc_fw_status(uc_fw) >= XE_UC_FIRMWARE_TRANSFERRED; 143 } 144 145 static inline bool xe_uc_fw_is_running(struct xe_uc_fw *uc_fw) 146 { 147 return __xe_uc_fw_status(uc_fw) == XE_UC_FIRMWARE_RUNNING; 148 } 149 150 static inline bool xe_uc_fw_is_overridden(const struct xe_uc_fw *uc_fw) 151 { 152 return uc_fw->user_overridden; 153 } 154 155 static inline void xe_uc_fw_sanitize(struct xe_uc_fw *uc_fw) 156 { 157 if (xe_uc_fw_is_loaded(uc_fw)) 158 xe_uc_fw_change_status(uc_fw, XE_UC_FIRMWARE_LOADABLE); 159 } 160 161 static inline u32 __xe_uc_fw_get_upload_size(struct xe_uc_fw *uc_fw) 162 { 163 return sizeof(struct uc_css_header) + uc_fw->ucode_size; 164 } 165 166 /** 167 * xe_uc_fw_get_upload_size() - Get size of firmware needed to be uploaded. 168 * @uc_fw: uC firmware. 169 * 170 * Get the size of the firmware and header that will be uploaded to WOPCM. 171 * 172 * Return: Upload firmware size, or zero on firmware fetch failure. 173 */ 174 static inline u32 xe_uc_fw_get_upload_size(struct xe_uc_fw *uc_fw) 175 { 176 if (!xe_uc_fw_is_available(uc_fw)) 177 return 0; 178 179 return __xe_uc_fw_get_upload_size(uc_fw); 180 } 181 182 #define XE_UC_FIRMWARE_URL "https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git" 183 184 #endif 185