1 // SPDX-License-Identifier: MIT
2 /*
3  * Copyright © 2014-2019 Intel Corporation
4  */
5 
6 #include "gt/intel_gt.h"
7 #include "intel_huc_fw.h"
8 #include "i915_drv.h"
9 
10 /**
11  * DOC: HuC Firmware
12  *
13  * Motivation:
14  * GEN9 introduces a new dedicated firmware for usage in media HEVC (High
15  * Efficiency Video Coding) operations. Userspace can use the firmware
16  * capabilities by adding HuC specific commands to batch buffers.
17  *
18  * Implementation:
19  * The same firmware loader is used as the GuC. However, the actual
20  * loading to HW is deferred until GEM initialization is done.
21  *
22  * Note that HuC firmware loading must be done before GuC loading.
23  */
24 
25 /**
26  * intel_huc_fw_init_early() - initializes HuC firmware struct
27  * @huc: intel_huc struct
28  *
29  * On platforms with HuC selects firmware for uploading
30  */
31 void intel_huc_fw_init_early(struct intel_huc *huc)
32 {
33 	struct intel_gt *gt = huc_to_gt(huc);
34 	struct intel_uc *uc = &gt->uc;
35 	struct drm_i915_private *i915 = gt->i915;
36 
37 	intel_uc_fw_init_early(&huc->fw, INTEL_UC_FW_TYPE_HUC,
38 			       intel_uc_uses_guc(uc),
39 			       INTEL_INFO(i915)->platform, INTEL_REVID(i915));
40 }
41 
42 /**
43  * intel_huc_fw_upload() - load HuC uCode to device
44  * @huc: intel_huc structure
45  *
46  * Called from intel_uc_init_hw() during driver load, resume from sleep and
47  * after a GPU reset. Note that HuC must be loaded before GuC.
48  *
49  * The firmware image should have already been fetched into memory, so only
50  * check that fetch succeeded, and then transfer the image to the h/w.
51  *
52  * Return:	non-zero code on error
53  */
54 int intel_huc_fw_upload(struct intel_huc *huc)
55 {
56 	/* HW doesn't look at destination address for HuC, so set it to 0 */
57 	return intel_uc_fw_upload(&huc->fw, huc_to_gt(huc), 0, HUC_UKERNEL);
58 }
59