1c349dbc7Sjsg /* SPDX-License-Identifier: MIT */
2c349dbc7Sjsg /*
3c349dbc7Sjsg * Copyright © 2014-2019 Intel Corporation
4c349dbc7Sjsg */
5c349dbc7Sjsg
6c349dbc7Sjsg #ifndef _INTEL_HUC_H_
7c349dbc7Sjsg #define _INTEL_HUC_H_
8c349dbc7Sjsg
91bb76ff1Sjsg #include "i915_reg_defs.h"
10*f005ef32Sjsg #include "i915_sw_fence.h"
11c349dbc7Sjsg #include "intel_uc_fw.h"
12c349dbc7Sjsg #include "intel_huc_fw.h"
13c349dbc7Sjsg
14*f005ef32Sjsg #include <linux/notifier.h>
15*f005ef32Sjsg #include <linux/hrtimer.h>
16*f005ef32Sjsg
17*f005ef32Sjsg struct bus_type;
18*f005ef32Sjsg struct i915_vma;
19*f005ef32Sjsg
20*f005ef32Sjsg enum intel_huc_delayed_load_status {
21*f005ef32Sjsg INTEL_HUC_WAITING_ON_GSC = 0,
22*f005ef32Sjsg INTEL_HUC_WAITING_ON_PXP,
23*f005ef32Sjsg INTEL_HUC_DELAYED_LOAD_ERROR,
24*f005ef32Sjsg };
25*f005ef32Sjsg
26*f005ef32Sjsg enum intel_huc_authentication_type {
27*f005ef32Sjsg INTEL_HUC_AUTH_BY_GUC = 0,
28*f005ef32Sjsg INTEL_HUC_AUTH_BY_GSC,
29*f005ef32Sjsg INTEL_HUC_AUTH_MAX_MODES
30*f005ef32Sjsg };
31*f005ef32Sjsg
32c349dbc7Sjsg struct intel_huc {
33c349dbc7Sjsg /* Generic uC firmware management */
34c349dbc7Sjsg struct intel_uc_fw fw;
35c349dbc7Sjsg
36c349dbc7Sjsg /* HuC-specific additions */
37c349dbc7Sjsg struct {
38c349dbc7Sjsg i915_reg_t reg;
39c349dbc7Sjsg u32 mask;
40c349dbc7Sjsg u32 value;
41*f005ef32Sjsg } status[INTEL_HUC_AUTH_MAX_MODES];
42*f005ef32Sjsg
43*f005ef32Sjsg struct {
44*f005ef32Sjsg struct i915_sw_fence fence;
45*f005ef32Sjsg struct timeout timer;
46*f005ef32Sjsg struct notifier_block nb;
47*f005ef32Sjsg enum intel_huc_delayed_load_status status;
48*f005ef32Sjsg } delayed_load;
49*f005ef32Sjsg
50*f005ef32Sjsg /* for load via GSCCS */
51*f005ef32Sjsg struct i915_vma *heci_pkt;
52*f005ef32Sjsg
53*f005ef32Sjsg bool loaded_via_gsc;
54c349dbc7Sjsg };
55c349dbc7Sjsg
56*f005ef32Sjsg int intel_huc_sanitize(struct intel_huc *huc);
57c349dbc7Sjsg void intel_huc_init_early(struct intel_huc *huc);
58c349dbc7Sjsg int intel_huc_init(struct intel_huc *huc);
59c349dbc7Sjsg void intel_huc_fini(struct intel_huc *huc);
60*f005ef32Sjsg void intel_huc_suspend(struct intel_huc *huc);
61*f005ef32Sjsg int intel_huc_auth(struct intel_huc *huc, enum intel_huc_authentication_type type);
62*f005ef32Sjsg int intel_huc_wait_for_auth_complete(struct intel_huc *huc,
63*f005ef32Sjsg enum intel_huc_authentication_type type);
64*f005ef32Sjsg bool intel_huc_is_authenticated(struct intel_huc *huc,
65*f005ef32Sjsg enum intel_huc_authentication_type type);
66c349dbc7Sjsg int intel_huc_check_status(struct intel_huc *huc);
671bb76ff1Sjsg void intel_huc_update_auth_status(struct intel_huc *huc);
68c349dbc7Sjsg
69*f005ef32Sjsg void intel_huc_register_gsc_notifier(struct intel_huc *huc, const struct bus_type *bus);
70*f005ef32Sjsg void intel_huc_unregister_gsc_notifier(struct intel_huc *huc, const struct bus_type *bus);
71c349dbc7Sjsg
intel_huc_is_supported(struct intel_huc * huc)72c349dbc7Sjsg static inline bool intel_huc_is_supported(struct intel_huc *huc)
73c349dbc7Sjsg {
74c349dbc7Sjsg return intel_uc_fw_is_supported(&huc->fw);
75c349dbc7Sjsg }
76c349dbc7Sjsg
intel_huc_is_wanted(struct intel_huc * huc)77c349dbc7Sjsg static inline bool intel_huc_is_wanted(struct intel_huc *huc)
78c349dbc7Sjsg {
79c349dbc7Sjsg return intel_uc_fw_is_enabled(&huc->fw);
80c349dbc7Sjsg }
81c349dbc7Sjsg
intel_huc_is_used(struct intel_huc * huc)82c349dbc7Sjsg static inline bool intel_huc_is_used(struct intel_huc *huc)
83c349dbc7Sjsg {
84c349dbc7Sjsg GEM_BUG_ON(__intel_uc_fw_status(&huc->fw) == INTEL_UC_FIRMWARE_SELECTED);
85c349dbc7Sjsg return intel_uc_fw_is_available(&huc->fw);
86c349dbc7Sjsg }
87c349dbc7Sjsg
intel_huc_is_loaded_by_gsc(const struct intel_huc * huc)881bb76ff1Sjsg static inline bool intel_huc_is_loaded_by_gsc(const struct intel_huc *huc)
89c349dbc7Sjsg {
90*f005ef32Sjsg return huc->loaded_via_gsc;
91*f005ef32Sjsg }
92*f005ef32Sjsg
intel_huc_wait_required(struct intel_huc * huc)93*f005ef32Sjsg static inline bool intel_huc_wait_required(struct intel_huc *huc)
94*f005ef32Sjsg {
95*f005ef32Sjsg return intel_huc_is_used(huc) && intel_huc_is_loaded_by_gsc(huc) &&
96*f005ef32Sjsg !intel_huc_is_authenticated(huc, INTEL_HUC_AUTH_BY_GSC);
97c349dbc7Sjsg }
98c349dbc7Sjsg
99ad8b1aafSjsg void intel_huc_load_status(struct intel_huc *huc, struct drm_printer *p);
100ad8b1aafSjsg
101c349dbc7Sjsg #endif
102