1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30#include "intel_guc_fw.h"
31#include "i915_drv.h"
32
33#define __MAKE_GUC_FW_PATH(KEY) \
34 "i915/" \
35 __stringify(KEY##_GUC_FW_PREFIX) "_guc_" \
36 __stringify(KEY##_GUC_FW_MAJOR) "." \
37 __stringify(KEY##_GUC_FW_MINOR) "." \
38 __stringify(KEY##_GUC_FW_PATCH) ".bin"
39
40#define SKL_GUC_FW_PREFIX skl
41#define SKL_GUC_FW_MAJOR 32
42#define SKL_GUC_FW_MINOR 0
43#define SKL_GUC_FW_PATCH 3
44#define SKL_GUC_FIRMWARE_PATH __MAKE_GUC_FW_PATH(SKL)
45MODULE_FIRMWARE(SKL_GUC_FIRMWARE_PATH);
46
47#define BXT_GUC_FW_PREFIX bxt
48#define BXT_GUC_FW_MAJOR 32
49#define BXT_GUC_FW_MINOR 0
50#define BXT_GUC_FW_PATCH 3
51#define BXT_GUC_FIRMWARE_PATH __MAKE_GUC_FW_PATH(BXT)
52MODULE_FIRMWARE(BXT_GUC_FIRMWARE_PATH);
53
54#define KBL_GUC_FW_PREFIX kbl
55#define KBL_GUC_FW_MAJOR 32
56#define KBL_GUC_FW_MINOR 0
57#define KBL_GUC_FW_PATCH 3
58#define KBL_GUC_FIRMWARE_PATH __MAKE_GUC_FW_PATH(KBL)
59MODULE_FIRMWARE(KBL_GUC_FIRMWARE_PATH);
60
61#define GLK_GUC_FW_PREFIX glk
62#define GLK_GUC_FW_MAJOR 32
63#define GLK_GUC_FW_MINOR 0
64#define GLK_GUC_FW_PATCH 3
65#define GLK_GUC_FIRMWARE_PATH __MAKE_GUC_FW_PATH(GLK)
66MODULE_FIRMWARE(GLK_GUC_FIRMWARE_PATH);
67
68#define ICL_GUC_FW_PREFIX icl
69#define ICL_GUC_FW_MAJOR 32
70#define ICL_GUC_FW_MINOR 0
71#define ICL_GUC_FW_PATCH 3
72#define ICL_GUC_FIRMWARE_PATH __MAKE_GUC_FW_PATH(ICL)
73MODULE_FIRMWARE(ICL_GUC_FIRMWARE_PATH);
74
75static void guc_fw_select(struct intel_uc_fw *guc_fw)
76{
77 struct intel_guc *guc = container_of(guc_fw, struct intel_guc, fw);
78 struct drm_i915_private *i915 = guc_to_i915(guc);
79
80 GEM_BUG_ON(guc_fw->type != INTEL_UC_FW_TYPE_GUC);
81
82 if (!HAS_GUC(i915))
83 return;
84
85 if (i915_modparams.guc_firmware_path) {
86 guc_fw->path = i915_modparams.guc_firmware_path;
87 guc_fw->major_ver_wanted = 0;
88 guc_fw->minor_ver_wanted = 0;
89 } else if (IS_ICELAKE(i915)) {
90 guc_fw->path = ICL_GUC_FIRMWARE_PATH;
91 guc_fw->major_ver_wanted = ICL_GUC_FW_MAJOR;
92 guc_fw->minor_ver_wanted = ICL_GUC_FW_MINOR;
93 } else if (IS_GEMINILAKE(i915)) {
94 guc_fw->path = GLK_GUC_FIRMWARE_PATH;
95 guc_fw->major_ver_wanted = GLK_GUC_FW_MAJOR;
96 guc_fw->minor_ver_wanted = GLK_GUC_FW_MINOR;
97 } else if (IS_KABYLAKE(i915) || IS_COFFEELAKE(i915)) {
98 guc_fw->path = KBL_GUC_FIRMWARE_PATH;
99 guc_fw->major_ver_wanted = KBL_GUC_FW_MAJOR;
100 guc_fw->minor_ver_wanted = KBL_GUC_FW_MINOR;
101 } else if (IS_BROXTON(i915)) {
102 guc_fw->path = BXT_GUC_FIRMWARE_PATH;
103 guc_fw->major_ver_wanted = BXT_GUC_FW_MAJOR;
104 guc_fw->minor_ver_wanted = BXT_GUC_FW_MINOR;
105 } else if (IS_SKYLAKE(i915)) {
106 guc_fw->path = SKL_GUC_FIRMWARE_PATH;
107 guc_fw->major_ver_wanted = SKL_GUC_FW_MAJOR;
108 guc_fw->minor_ver_wanted = SKL_GUC_FW_MINOR;
109 }
110}
111
112
113
114
115
116
117
118void intel_guc_fw_init_early(struct intel_guc *guc)
119{
120 struct intel_uc_fw *guc_fw = &guc->fw;
121
122 intel_uc_fw_init_early(guc_fw, INTEL_UC_FW_TYPE_GUC);
123 guc_fw_select(guc_fw);
124}
125
126static void guc_prepare_xfer(struct intel_guc *guc)
127{
128 struct drm_i915_private *dev_priv = guc_to_i915(guc);
129
130
131 I915_WRITE(GUC_SHIM_CONTROL, GUC_DISABLE_SRAM_INIT_TO_ZEROES |
132 GUC_ENABLE_READ_CACHE_LOGIC |
133 GUC_ENABLE_MIA_CACHING |
134 GUC_ENABLE_READ_CACHE_FOR_SRAM_DATA |
135 GUC_ENABLE_READ_CACHE_FOR_WOPCM_DATA |
136 GUC_ENABLE_MIA_CLOCK_GATING);
137
138 if (IS_GEN9_LP(dev_priv))
139 I915_WRITE(GEN9LP_GT_PM_CONFIG, GT_DOORBELL_ENABLE);
140 else
141 I915_WRITE(GEN9_GT_PM_CONFIG, GT_DOORBELL_ENABLE);
142
143 if (IS_GEN(dev_priv, 9)) {
144
145 I915_WRITE(GEN7_MISCCPCTL, (GEN8_DOP_CLOCK_GATE_GUC_ENABLE |
146 I915_READ(GEN7_MISCCPCTL)));
147
148
149 I915_WRITE(GUC_ARAT_C6DIS, 0x1FF);
150 }
151}
152
153
154static void guc_xfer_rsa(struct intel_guc *guc)
155{
156 struct drm_i915_private *dev_priv = guc_to_i915(guc);
157 struct intel_uc_fw *fw = &guc->fw;
158 struct sg_table *pages = fw->obj->mm.pages;
159 u32 rsa[UOS_RSA_SCRATCH_COUNT];
160 int i;
161
162 sg_pcopy_to_buffer(pages->sgl, pages->nents,
163 rsa, sizeof(rsa), fw->rsa_offset);
164
165 for (i = 0; i < UOS_RSA_SCRATCH_COUNT; i++)
166 I915_WRITE(UOS_RSA_SCRATCH(i), rsa[i]);
167}
168
169static bool guc_xfer_completed(struct intel_guc *guc, u32 *status)
170{
171 struct drm_i915_private *dev_priv = guc_to_i915(guc);
172
173
174 *status = I915_READ(DMA_CTRL);
175 return !(*status & START_DMA);
176}
177
178
179
180
181
182
183
184
185
186
187static inline bool guc_ready(struct intel_guc *guc, u32 *status)
188{
189 struct drm_i915_private *dev_priv = guc_to_i915(guc);
190 u32 val = I915_READ(GUC_STATUS);
191 u32 uk_val = val & GS_UKERNEL_MASK;
192
193 *status = val;
194 return (uk_val == GS_UKERNEL_READY) ||
195 ((val & GS_MIA_CORE_STATE) && (uk_val == GS_UKERNEL_LAPIC_DONE));
196}
197
198static int guc_wait_ucode(struct intel_guc *guc)
199{
200 u32 status;
201 int ret;
202
203
204
205
206
207
208
209
210
211 ret = wait_for(guc_ready(guc, &status), 100);
212 DRM_DEBUG_DRIVER("GuC status %#x\n", status);
213
214 if ((status & GS_BOOTROM_MASK) == GS_BOOTROM_RSA_FAILED) {
215 DRM_ERROR("GuC firmware signature verification failed\n");
216 ret = -ENOEXEC;
217 }
218
219 if (ret == 0 && !guc_xfer_completed(guc, &status)) {
220 DRM_ERROR("GuC is ready, but the xfer %08x is incomplete\n",
221 status);
222 ret = -ENXIO;
223 }
224
225 return ret;
226}
227
228
229
230
231
232
233
234
235static int guc_xfer_ucode(struct intel_guc *guc)
236{
237 struct drm_i915_private *dev_priv = guc_to_i915(guc);
238 struct intel_uc_fw *guc_fw = &guc->fw;
239 unsigned long offset;
240
241
242
243
244
245 I915_WRITE(DMA_COPY_SIZE, guc_fw->header_size + guc_fw->ucode_size);
246
247
248 offset = intel_uc_fw_ggtt_offset(guc_fw) + guc_fw->header_offset;
249 I915_WRITE(DMA_ADDR_0_LOW, lower_32_bits(offset));
250 I915_WRITE(DMA_ADDR_0_HIGH, upper_32_bits(offset) & 0xFFFF);
251
252
253
254
255
256 I915_WRITE(DMA_ADDR_1_LOW, 0x2000);
257 I915_WRITE(DMA_ADDR_1_HIGH, DMA_ADDRESS_SPACE_WOPCM);
258
259
260 I915_WRITE(DMA_CTRL, _MASKED_BIT_ENABLE(UOS_MOVE | START_DMA));
261
262 return guc_wait_ucode(guc);
263}
264
265
266
267static int guc_fw_xfer(struct intel_uc_fw *guc_fw)
268{
269 struct intel_guc *guc = container_of(guc_fw, struct intel_guc, fw);
270 struct drm_i915_private *dev_priv = guc_to_i915(guc);
271 int ret;
272
273 GEM_BUG_ON(guc_fw->type != INTEL_UC_FW_TYPE_GUC);
274
275 intel_uncore_forcewake_get(&dev_priv->uncore, FORCEWAKE_ALL);
276
277 guc_prepare_xfer(guc);
278
279
280
281
282
283
284 guc_xfer_rsa(guc);
285
286 ret = guc_xfer_ucode(guc);
287
288 intel_uncore_forcewake_put(&dev_priv->uncore, FORCEWAKE_ALL);
289
290 return ret;
291}
292
293
294
295
296
297
298
299
300
301
302
303
304
305int intel_guc_fw_upload(struct intel_guc *guc)
306{
307 return intel_uc_fw_upload(&guc->fw, guc_fw_xfer);
308}
309