1 // SPDX-License-Identifier: MIT 2 /* 3 * Copyright © 2014-2019 Intel Corporation 4 */ 5 6 #include "gt/intel_gsc.h" 7 #include "gt/intel_gt.h" 8 #include "intel_huc.h" 9 #include "intel_huc_fw.h" 10 #include "i915_drv.h" 11 #include "pxp/intel_pxp_huc.h" 12 13 int intel_huc_fw_load_and_auth_via_gsc(struct intel_huc *huc) 14 { 15 int ret; 16 17 if (!intel_huc_is_loaded_by_gsc(huc)) 18 return -ENODEV; 19 20 if (!intel_uc_fw_is_loadable(&huc->fw)) 21 return -ENOEXEC; 22 23 /* 24 * If we abort a suspend, HuC might still be loaded when the mei 25 * component gets re-bound and this function called again. If so, just 26 * mark the HuC as loaded. 27 */ 28 if (intel_huc_is_authenticated(huc)) { 29 intel_uc_fw_change_status(&huc->fw, INTEL_UC_FIRMWARE_RUNNING); 30 return 0; 31 } 32 33 GEM_WARN_ON(intel_uc_fw_is_loaded(&huc->fw)); 34 35 ret = intel_pxp_huc_load_and_auth(huc_to_gt(huc)->i915->pxp); 36 if (ret) 37 return ret; 38 39 intel_uc_fw_change_status(&huc->fw, INTEL_UC_FIRMWARE_TRANSFERRED); 40 41 return intel_huc_wait_for_auth_complete(huc); 42 } 43 44 /** 45 * intel_huc_fw_upload() - load HuC uCode to device via DMA transfer 46 * @huc: intel_huc structure 47 * 48 * Called from intel_uc_init_hw() during driver load, resume from sleep and 49 * after a GPU reset. Note that HuC must be loaded before GuC. 50 * 51 * The firmware image should have already been fetched into memory, so only 52 * check that fetch succeeded, and then transfer the image to the h/w. 53 * 54 * Return: non-zero code on error 55 */ 56 int intel_huc_fw_upload(struct intel_huc *huc) 57 { 58 if (intel_huc_is_loaded_by_gsc(huc)) 59 return -ENODEV; 60 61 /* HW doesn't look at destination address for HuC, so set it to 0 */ 62 return intel_uc_fw_upload(&huc->fw, 0, HUC_UKERNEL); 63 } 64