brintos

brintos / linux-shallow public Read only

0
0
Text · 4.8 KiB · 6195e35 Raw
194 lines · c
1/* SPDX-License-Identifier: MIT */2/*3 * Copyright © 2022 Intel Corporation4 */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 15struct drm_printer;16 17int xe_uc_fw_init(struct xe_uc_fw *uc_fw);18size_t xe_uc_fw_copy_rsa(struct xe_uc_fw *uc_fw, void *dst, u32 max_len);19int xe_uc_fw_upload(struct xe_uc_fw *uc_fw, u32 offset, u32 dma_flags);20int xe_uc_fw_check_version_requirements(struct xe_uc_fw *uc_fw);21void xe_uc_fw_print(struct xe_uc_fw *uc_fw, struct drm_printer *p);22 23static 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 28static 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 34static inline35const 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	case XE_UC_FIRMWARE_PRELOADED:63		return "PRELOADED";64	}65	return "<invalid>";66}67 68static inline int xe_uc_fw_status_to_error(const enum xe_uc_fw_status status)69{70	switch (status) {71	case XE_UC_FIRMWARE_NOT_SUPPORTED:72		return -ENODEV;73	case XE_UC_FIRMWARE_UNINITIALIZED:74		return -EACCES;75	case XE_UC_FIRMWARE_DISABLED:76		return -EPERM;77	case XE_UC_FIRMWARE_MISSING:78		return -ENOENT;79	case XE_UC_FIRMWARE_ERROR:80		return -ENOEXEC;81	case XE_UC_FIRMWARE_INIT_FAIL:82	case XE_UC_FIRMWARE_LOAD_FAIL:83		return -EIO;84	case XE_UC_FIRMWARE_SELECTED:85		return -ESTALE;86	case XE_UC_FIRMWARE_AVAILABLE:87	case XE_UC_FIRMWARE_LOADABLE:88	case XE_UC_FIRMWARE_TRANSFERRED:89	case XE_UC_FIRMWARE_RUNNING:90	case XE_UC_FIRMWARE_PRELOADED:91		return 0;92	}93	return -EINVAL;94}95 96static inline const char *xe_uc_fw_type_repr(enum xe_uc_fw_type type)97{98	switch (type) {99	case XE_UC_FW_TYPE_GUC:100		return "GuC";101	case XE_UC_FW_TYPE_HUC:102		return "HuC";103	case XE_UC_FW_TYPE_GSC:104		return "GSC";105	default:106		return "uC";107	}108}109 110static inline enum xe_uc_fw_status111__xe_uc_fw_status(const struct xe_uc_fw *uc_fw)112{113	/* shouldn't call this before checking hw/blob availability */114	XE_WARN_ON(uc_fw->status == XE_UC_FIRMWARE_UNINITIALIZED);115	return uc_fw->status;116}117 118static inline bool xe_uc_fw_is_supported(struct xe_uc_fw *uc_fw)119{120	return __xe_uc_fw_status(uc_fw) != XE_UC_FIRMWARE_NOT_SUPPORTED;121}122 123static inline bool xe_uc_fw_is_enabled(struct xe_uc_fw *uc_fw)124{125	return __xe_uc_fw_status(uc_fw) > XE_UC_FIRMWARE_DISABLED;126}127 128static inline bool xe_uc_fw_is_disabled(struct xe_uc_fw *uc_fw)129{130	return __xe_uc_fw_status(uc_fw) == XE_UC_FIRMWARE_DISABLED;131}132 133static inline bool xe_uc_fw_is_available(struct xe_uc_fw *uc_fw)134{135	return __xe_uc_fw_status(uc_fw) >= XE_UC_FIRMWARE_AVAILABLE;136}137 138static inline bool xe_uc_fw_is_loadable(struct xe_uc_fw *uc_fw)139{140	return __xe_uc_fw_status(uc_fw) >= XE_UC_FIRMWARE_LOADABLE &&141		__xe_uc_fw_status(uc_fw) != XE_UC_FIRMWARE_PRELOADED;142}143 144static inline bool xe_uc_fw_is_loaded(struct xe_uc_fw *uc_fw)145{146	return __xe_uc_fw_status(uc_fw) >= XE_UC_FIRMWARE_TRANSFERRED;147}148 149static inline bool xe_uc_fw_is_running(struct xe_uc_fw *uc_fw)150{151	return __xe_uc_fw_status(uc_fw) >= XE_UC_FIRMWARE_RUNNING;152}153 154static inline bool xe_uc_fw_is_overridden(const struct xe_uc_fw *uc_fw)155{156	return uc_fw->user_overridden;157}158 159static inline bool xe_uc_fw_is_in_error_state(const struct xe_uc_fw *uc_fw)160{161	return xe_uc_fw_status_to_error(__xe_uc_fw_status(uc_fw)) < 0;162}163 164static inline void xe_uc_fw_sanitize(struct xe_uc_fw *uc_fw)165{166	if (xe_uc_fw_is_loadable(uc_fw))167		xe_uc_fw_change_status(uc_fw, XE_UC_FIRMWARE_LOADABLE);168}169 170static inline u32 __xe_uc_fw_get_upload_size(struct xe_uc_fw *uc_fw)171{172	return sizeof(struct uc_css_header) + uc_fw->ucode_size;173}174 175/**176 * xe_uc_fw_get_upload_size() - Get size of firmware needed to be uploaded.177 * @uc_fw: uC firmware.178 *179 * Get the size of the firmware and header that will be uploaded to WOPCM.180 *181 * Return: Upload firmware size, or zero on firmware fetch failure.182 */183static inline u32 xe_uc_fw_get_upload_size(struct xe_uc_fw *uc_fw)184{185	if (!xe_uc_fw_is_available(uc_fw))186		return 0;187 188	return __xe_uc_fw_get_upload_size(uc_fw);189}190 191#define XE_UC_FIRMWARE_URL "https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git"192 193#endif194