1 // SPDX-License-Identifier: MIT
2 /*
3 * Copyright © 2016-2019 Intel Corporation
4 */
5
6 #include "gt/intel_gt.h"
7 #include "gt/intel_reset.h"
8 #include "intel_guc.h"
9 #include "intel_guc_ads.h"
10 #include "intel_guc_submission.h"
11 #include "intel_uc.h"
12
13 #include "i915_drv.h"
14
15 /* Reset GuC providing us with fresh state for both GuC and HuC.
16 */
__intel_uc_reset_hw(struct intel_uc * uc)17 static int __intel_uc_reset_hw(struct intel_uc *uc)
18 {
19 struct intel_gt *gt = uc_to_gt(uc);
20 int ret;
21 u32 guc_status;
22
23 ret = i915_inject_load_error(gt->i915, -ENXIO);
24 if (ret)
25 return ret;
26
27 ret = intel_reset_guc(gt);
28 if (ret) {
29 DRM_ERROR("Failed to reset GuC, ret = %d\n", ret);
30 return ret;
31 }
32
33 guc_status = intel_uncore_read(gt->uncore, GUC_STATUS);
34 WARN(!(guc_status & GS_MIA_IN_RESET),
35 "GuC status: 0x%x, MIA core expected to be in reset\n",
36 guc_status);
37
38 return ret;
39 }
40
__confirm_options(struct intel_uc * uc)41 static void __confirm_options(struct intel_uc *uc)
42 {
43 struct drm_i915_private *i915 = uc_to_gt(uc)->i915;
44
45 DRM_DEV_DEBUG_DRIVER(i915->drm.dev,
46 "enable_guc=%d (guc:%s submission:%s huc:%s)\n",
47 i915_modparams.enable_guc,
48 yesno(intel_uc_uses_guc(uc)),
49 yesno(intel_uc_uses_guc_submission(uc)),
50 yesno(intel_uc_uses_huc(uc)));
51
52 if (i915_modparams.enable_guc == -1)
53 return;
54
55 if (i915_modparams.enable_guc == 0) {
56 GEM_BUG_ON(intel_uc_uses_guc(uc));
57 GEM_BUG_ON(intel_uc_uses_guc_submission(uc));
58 GEM_BUG_ON(intel_uc_uses_huc(uc));
59 return;
60 }
61
62 if (!intel_uc_supports_guc(uc))
63 dev_info(i915->drm.dev,
64 "Incompatible option enable_guc=%d - %s\n",
65 i915_modparams.enable_guc, "GuC is not supported!");
66
67 if (i915_modparams.enable_guc & ENABLE_GUC_LOAD_HUC &&
68 !intel_uc_supports_huc(uc))
69 dev_info(i915->drm.dev,
70 "Incompatible option enable_guc=%d - %s\n",
71 i915_modparams.enable_guc, "HuC is not supported!");
72
73 if (i915_modparams.enable_guc & ENABLE_GUC_SUBMISSION &&
74 !intel_uc_supports_guc_submission(uc))
75 dev_info(i915->drm.dev,
76 "Incompatible option enable_guc=%d - %s\n",
77 i915_modparams.enable_guc, "GuC submission is N/A");
78
79 if (i915_modparams.enable_guc & ~(ENABLE_GUC_SUBMISSION |
80 ENABLE_GUC_LOAD_HUC))
81 dev_info(i915->drm.dev,
82 "Incompatible option enable_guc=%d - %s\n",
83 i915_modparams.enable_guc, "undocumented flag");
84 }
85
intel_uc_init_early(struct intel_uc * uc)86 void intel_uc_init_early(struct intel_uc *uc)
87 {
88 intel_guc_init_early(&uc->guc);
89 intel_huc_init_early(&uc->huc);
90
91 __confirm_options(uc);
92 }
93
intel_uc_driver_late_release(struct intel_uc * uc)94 void intel_uc_driver_late_release(struct intel_uc *uc)
95 {
96 }
97
98 /**
99 * intel_uc_init_mmio - setup uC MMIO access
100 * @uc: the intel_uc structure
101 *
102 * Setup minimal state necessary for MMIO accesses later in the
103 * initialization sequence.
104 */
intel_uc_init_mmio(struct intel_uc * uc)105 void intel_uc_init_mmio(struct intel_uc *uc)
106 {
107 intel_guc_init_send_regs(&uc->guc);
108 }
109
__uc_capture_load_err_log(struct intel_uc * uc)110 static void __uc_capture_load_err_log(struct intel_uc *uc)
111 {
112 struct intel_guc *guc = &uc->guc;
113
114 if (guc->log.vma && !uc->load_err_log)
115 uc->load_err_log = i915_gem_object_get(guc->log.vma->obj);
116 }
117
__uc_free_load_err_log(struct intel_uc * uc)118 static void __uc_free_load_err_log(struct intel_uc *uc)
119 {
120 struct drm_i915_gem_object *log = fetch_and_zero(&uc->load_err_log);
121
122 if (log)
123 i915_gem_object_put(log);
124 }
125
126 /*
127 * Events triggered while CT buffers are disabled are logged in the SCRATCH_15
128 * register using the same bits used in the CT message payload. Since our
129 * communication channel with guc is turned off at this point, we can save the
130 * message and handle it after we turn it back on.
131 */
guc_clear_mmio_msg(struct intel_guc * guc)132 static void guc_clear_mmio_msg(struct intel_guc *guc)
133 {
134 intel_uncore_write(guc_to_gt(guc)->uncore, SOFT_SCRATCH(15), 0);
135 }
136
guc_get_mmio_msg(struct intel_guc * guc)137 static void guc_get_mmio_msg(struct intel_guc *guc)
138 {
139 u32 val;
140
141 spin_lock_irq(&guc->irq_lock);
142
143 val = intel_uncore_read(guc_to_gt(guc)->uncore, SOFT_SCRATCH(15));
144 guc->mmio_msg |= val & guc->msg_enabled_mask;
145
146 /*
147 * clear all events, including the ones we're not currently servicing,
148 * to make sure we don't try to process a stale message if we enable
149 * handling of more events later.
150 */
151 guc_clear_mmio_msg(guc);
152
153 spin_unlock_irq(&guc->irq_lock);
154 }
155
guc_handle_mmio_msg(struct intel_guc * guc)156 static void guc_handle_mmio_msg(struct intel_guc *guc)
157 {
158 struct drm_i915_private *i915 = guc_to_gt(guc)->i915;
159
160 /* we need communication to be enabled to reply to GuC */
161 GEM_BUG_ON(guc->handler == intel_guc_to_host_event_handler_nop);
162
163 if (!guc->mmio_msg)
164 return;
165
166 spin_lock_irq(&i915->irq_lock);
167 intel_guc_to_host_process_recv_msg(guc, &guc->mmio_msg, 1);
168 spin_unlock_irq(&i915->irq_lock);
169
170 guc->mmio_msg = 0;
171 }
172
guc_reset_interrupts(struct intel_guc * guc)173 static void guc_reset_interrupts(struct intel_guc *guc)
174 {
175 guc->interrupts.reset(guc);
176 }
177
guc_enable_interrupts(struct intel_guc * guc)178 static void guc_enable_interrupts(struct intel_guc *guc)
179 {
180 guc->interrupts.enable(guc);
181 }
182
guc_disable_interrupts(struct intel_guc * guc)183 static void guc_disable_interrupts(struct intel_guc *guc)
184 {
185 guc->interrupts.disable(guc);
186 }
187
guc_communication_enabled(struct intel_guc * guc)188 static inline bool guc_communication_enabled(struct intel_guc *guc)
189 {
190 return guc->send != intel_guc_send_nop;
191 }
192
guc_enable_communication(struct intel_guc * guc)193 static int guc_enable_communication(struct intel_guc *guc)
194 {
195 struct drm_i915_private *i915 = guc_to_gt(guc)->i915;
196 int ret;
197
198 GEM_BUG_ON(guc_communication_enabled(guc));
199
200 ret = i915_inject_load_error(i915, -ENXIO);
201 if (ret)
202 return ret;
203
204 ret = intel_guc_ct_enable(&guc->ct);
205 if (ret)
206 return ret;
207
208 guc->send = intel_guc_send_ct;
209 guc->handler = intel_guc_to_host_event_handler_ct;
210
211 /* check for mmio messages received before/during the CT enable */
212 guc_get_mmio_msg(guc);
213 guc_handle_mmio_msg(guc);
214
215 guc_enable_interrupts(guc);
216
217 /* check for CT messages received before we enabled interrupts */
218 spin_lock_irq(&i915->irq_lock);
219 intel_guc_to_host_event_handler_ct(guc);
220 spin_unlock_irq(&i915->irq_lock);
221
222 DRM_INFO("GuC communication enabled\n");
223
224 return 0;
225 }
226
guc_stop_communication(struct intel_guc * guc)227 static void guc_stop_communication(struct intel_guc *guc)
228 {
229 intel_guc_ct_stop(&guc->ct);
230
231 guc->send = intel_guc_send_nop;
232 guc->handler = intel_guc_to_host_event_handler_nop;
233
234 guc_clear_mmio_msg(guc);
235 }
236
guc_disable_communication(struct intel_guc * guc)237 static void guc_disable_communication(struct intel_guc *guc)
238 {
239 /*
240 * Events generated during or after CT disable are logged by guc in
241 * via mmio. Make sure the register is clear before disabling CT since
242 * all events we cared about have already been processed via CT.
243 */
244 guc_clear_mmio_msg(guc);
245
246 guc_disable_interrupts(guc);
247
248 guc->send = intel_guc_send_nop;
249 guc->handler = intel_guc_to_host_event_handler_nop;
250
251 intel_guc_ct_disable(&guc->ct);
252
253 /*
254 * Check for messages received during/after the CT disable. We do not
255 * expect any messages to have arrived via CT between the interrupt
256 * disable and the CT disable because GuC should've been idle until we
257 * triggered the CT disable protocol.
258 */
259 guc_get_mmio_msg(guc);
260
261 DRM_INFO("GuC communication disabled\n");
262 }
263
intel_uc_fetch_firmwares(struct intel_uc * uc)264 void intel_uc_fetch_firmwares(struct intel_uc *uc)
265 {
266 struct drm_i915_private *i915 = uc_to_gt(uc)->i915;
267 int err;
268
269 if (!intel_uc_uses_guc(uc))
270 return;
271
272 err = intel_uc_fw_fetch(&uc->guc.fw, i915);
273 if (err)
274 return;
275
276 if (intel_uc_uses_huc(uc))
277 intel_uc_fw_fetch(&uc->huc.fw, i915);
278 }
279
intel_uc_cleanup_firmwares(struct intel_uc * uc)280 void intel_uc_cleanup_firmwares(struct intel_uc *uc)
281 {
282 if (!intel_uc_uses_guc(uc))
283 return;
284
285 if (intel_uc_uses_huc(uc))
286 intel_uc_fw_cleanup_fetch(&uc->huc.fw);
287
288 intel_uc_fw_cleanup_fetch(&uc->guc.fw);
289 }
290
intel_uc_init(struct intel_uc * uc)291 void intel_uc_init(struct intel_uc *uc)
292 {
293 struct intel_guc *guc = &uc->guc;
294 struct intel_huc *huc = &uc->huc;
295 int ret;
296
297 if (!intel_uc_uses_guc(uc))
298 return;
299
300 /* XXX: GuC submission is unavailable for now */
301 GEM_BUG_ON(intel_uc_supports_guc_submission(uc));
302
303 ret = intel_guc_init(guc);
304 if (ret) {
305 intel_uc_fw_cleanup_fetch(&huc->fw);
306 return;
307 }
308
309 if (intel_uc_uses_huc(uc))
310 intel_huc_init(huc);
311 }
312
intel_uc_fini(struct intel_uc * uc)313 void intel_uc_fini(struct intel_uc *uc)
314 {
315 struct intel_guc *guc = &uc->guc;
316
317 if (!intel_uc_uses_guc(uc))
318 return;
319
320 if (intel_uc_uses_huc(uc))
321 intel_huc_fini(&uc->huc);
322
323 intel_guc_fini(guc);
324
325 __uc_free_load_err_log(uc);
326 }
327
__uc_sanitize(struct intel_uc * uc)328 static int __uc_sanitize(struct intel_uc *uc)
329 {
330 struct intel_guc *guc = &uc->guc;
331 struct intel_huc *huc = &uc->huc;
332
333 GEM_BUG_ON(!intel_uc_supports_guc(uc));
334
335 intel_huc_sanitize(huc);
336 intel_guc_sanitize(guc);
337
338 return __intel_uc_reset_hw(uc);
339 }
340
intel_uc_sanitize(struct intel_uc * uc)341 void intel_uc_sanitize(struct intel_uc *uc)
342 {
343 if (!intel_uc_supports_guc(uc))
344 return;
345
346 __uc_sanitize(uc);
347 }
348
349 /* Initialize and verify the uC regs related to uC positioning in WOPCM */
uc_init_wopcm(struct intel_uc * uc)350 static int uc_init_wopcm(struct intel_uc *uc)
351 {
352 struct intel_gt *gt = uc_to_gt(uc);
353 struct intel_uncore *uncore = gt->uncore;
354 u32 base = intel_wopcm_guc_base(>->i915->wopcm);
355 u32 size = intel_wopcm_guc_size(>->i915->wopcm);
356 u32 huc_agent = intel_uc_uses_huc(uc) ? HUC_LOADING_AGENT_GUC : 0;
357 u32 mask;
358 int err;
359
360 if (unlikely(!base || !size)) {
361 i915_probe_error(gt->i915, "Unsuccessful WOPCM partitioning\n");
362 return -E2BIG;
363 }
364
365 GEM_BUG_ON(!intel_uc_supports_guc(uc));
366 GEM_BUG_ON(!(base & GUC_WOPCM_OFFSET_MASK));
367 GEM_BUG_ON(base & ~GUC_WOPCM_OFFSET_MASK);
368 GEM_BUG_ON(!(size & GUC_WOPCM_SIZE_MASK));
369 GEM_BUG_ON(size & ~GUC_WOPCM_SIZE_MASK);
370
371 err = i915_inject_load_error(gt->i915, -ENXIO);
372 if (err)
373 return err;
374
375 mask = GUC_WOPCM_SIZE_MASK | GUC_WOPCM_SIZE_LOCKED;
376 err = intel_uncore_write_and_verify(uncore, GUC_WOPCM_SIZE, size, mask,
377 size | GUC_WOPCM_SIZE_LOCKED);
378 if (err)
379 goto err_out;
380
381 mask = GUC_WOPCM_OFFSET_MASK | GUC_WOPCM_OFFSET_VALID | huc_agent;
382 err = intel_uncore_write_and_verify(uncore, DMA_GUC_WOPCM_OFFSET,
383 base | huc_agent, mask,
384 base | huc_agent |
385 GUC_WOPCM_OFFSET_VALID);
386 if (err)
387 goto err_out;
388
389 return 0;
390
391 err_out:
392 i915_probe_error(gt->i915, "Failed to init uC WOPCM registers!\n");
393 i915_probe_error(gt->i915, "%s(%#x)=%#x\n", "DMA_GUC_WOPCM_OFFSET",
394 i915_mmio_reg_offset(DMA_GUC_WOPCM_OFFSET),
395 intel_uncore_read(uncore, DMA_GUC_WOPCM_OFFSET));
396 i915_probe_error(gt->i915, "%s(%#x)=%#x\n", "GUC_WOPCM_SIZE",
397 i915_mmio_reg_offset(GUC_WOPCM_SIZE),
398 intel_uncore_read(uncore, GUC_WOPCM_SIZE));
399
400 return err;
401 }
402
uc_is_wopcm_locked(struct intel_uc * uc)403 static bool uc_is_wopcm_locked(struct intel_uc *uc)
404 {
405 struct intel_gt *gt = uc_to_gt(uc);
406 struct intel_uncore *uncore = gt->uncore;
407
408 return (intel_uncore_read(uncore, GUC_WOPCM_SIZE) & GUC_WOPCM_SIZE_LOCKED) ||
409 (intel_uncore_read(uncore, DMA_GUC_WOPCM_OFFSET) & GUC_WOPCM_OFFSET_VALID);
410 }
411
intel_uc_init_hw(struct intel_uc * uc)412 int intel_uc_init_hw(struct intel_uc *uc)
413 {
414 struct drm_i915_private *i915 = uc_to_gt(uc)->i915;
415 struct intel_guc *guc = &uc->guc;
416 struct intel_huc *huc = &uc->huc;
417 int ret, attempts;
418
419 if (!intel_uc_supports_guc(uc))
420 return 0;
421
422 /*
423 * We can silently continue without GuC only if it was never enabled
424 * before on this system after reboot, otherwise we risk GPU hangs.
425 * To check if GuC was loaded before we look at WOPCM registers.
426 */
427 if (!intel_uc_uses_guc(uc) && !uc_is_wopcm_locked(uc))
428 return 0;
429
430 if (!intel_uc_fw_is_available(&guc->fw)) {
431 ret = uc_is_wopcm_locked(uc) ||
432 intel_uc_fw_is_overridden(&guc->fw) ||
433 intel_uc_supports_guc_submission(uc) ?
434 intel_uc_fw_status_to_error(guc->fw.status) : 0;
435 goto err_out;
436 }
437
438 ret = uc_init_wopcm(uc);
439 if (ret)
440 goto err_out;
441
442 guc_reset_interrupts(guc);
443
444 /* WaEnableuKernelHeaderValidFix:skl */
445 /* WaEnableGuCBootHashCheckNotSet:skl,bxt,kbl */
446 if (IS_GEN(i915, 9))
447 attempts = 3;
448 else
449 attempts = 1;
450
451 while (attempts--) {
452 /*
453 * Always reset the GuC just before (re)loading, so
454 * that the state and timing are fairly predictable
455 */
456 ret = __uc_sanitize(uc);
457 if (ret)
458 goto err_out;
459
460 intel_huc_fw_upload(huc);
461 intel_guc_ads_reset(guc);
462 intel_guc_write_params(guc);
463 ret = intel_guc_fw_upload(guc);
464 if (ret == 0)
465 break;
466
467 DRM_DEBUG_DRIVER("GuC fw load failed: %d; will reset and "
468 "retry %d more time(s)\n", ret, attempts);
469 }
470
471 /* Did we succeded or run out of retries? */
472 if (ret)
473 goto err_log_capture;
474
475 ret = guc_enable_communication(guc);
476 if (ret)
477 goto err_log_capture;
478
479 intel_huc_auth(huc);
480
481 ret = intel_guc_sample_forcewake(guc);
482 if (ret)
483 goto err_communication;
484
485 if (intel_uc_supports_guc_submission(uc)) {
486 ret = intel_guc_submission_enable(guc);
487 if (ret)
488 goto err_communication;
489 }
490
491 dev_info(i915->drm.dev, "%s firmware %s version %u.%u %s:%s\n",
492 intel_uc_fw_type_repr(INTEL_UC_FW_TYPE_GUC), guc->fw.path,
493 guc->fw.major_ver_found, guc->fw.minor_ver_found,
494 "submission",
495 enableddisabled(intel_uc_supports_guc_submission(uc)));
496
497 if (intel_uc_uses_huc(uc)) {
498 dev_info(i915->drm.dev, "%s firmware %s version %u.%u %s:%s\n",
499 intel_uc_fw_type_repr(INTEL_UC_FW_TYPE_HUC),
500 huc->fw.path,
501 huc->fw.major_ver_found, huc->fw.minor_ver_found,
502 "authenticated",
503 yesno(intel_huc_is_authenticated(huc)));
504 }
505
506 return 0;
507
508 /*
509 * We've failed to load the firmware :(
510 */
511 err_communication:
512 guc_disable_communication(guc);
513 err_log_capture:
514 __uc_capture_load_err_log(uc);
515 err_out:
516 __uc_sanitize(uc);
517
518 if (!ret) {
519 dev_notice(i915->drm.dev, "GuC is uninitialized\n");
520 /* We want to run without GuC submission */
521 return 0;
522 }
523
524 i915_probe_error(i915, "GuC initialization failed %d\n", ret);
525
526 /* We want to keep KMS alive */
527 return -EIO;
528 }
529
intel_uc_fini_hw(struct intel_uc * uc)530 void intel_uc_fini_hw(struct intel_uc *uc)
531 {
532 struct intel_guc *guc = &uc->guc;
533
534 if (!intel_guc_is_running(guc))
535 return;
536
537 if (intel_uc_supports_guc_submission(uc))
538 intel_guc_submission_disable(guc);
539
540 guc_disable_communication(guc);
541 __uc_sanitize(uc);
542 }
543
544 /**
545 * intel_uc_reset_prepare - Prepare for reset
546 * @uc: the intel_uc structure
547 *
548 * Preparing for full gpu reset.
549 */
intel_uc_reset_prepare(struct intel_uc * uc)550 void intel_uc_reset_prepare(struct intel_uc *uc)
551 {
552 struct intel_guc *guc = &uc->guc;
553
554 if (!intel_guc_is_running(guc))
555 return;
556
557 guc_stop_communication(guc);
558 __uc_sanitize(uc);
559 }
560
intel_uc_runtime_suspend(struct intel_uc * uc)561 void intel_uc_runtime_suspend(struct intel_uc *uc)
562 {
563 struct intel_guc *guc = &uc->guc;
564 int err;
565
566 if (!intel_guc_is_running(guc))
567 return;
568
569 err = intel_guc_suspend(guc);
570 if (err)
571 DRM_DEBUG_DRIVER("Failed to suspend GuC, err=%d", err);
572
573 guc_disable_communication(guc);
574 }
575
intel_uc_suspend(struct intel_uc * uc)576 void intel_uc_suspend(struct intel_uc *uc)
577 {
578 struct intel_guc *guc = &uc->guc;
579 intel_wakeref_t wakeref;
580
581 if (!intel_guc_is_running(guc))
582 return;
583
584 with_intel_runtime_pm(&uc_to_gt(uc)->i915->runtime_pm, wakeref)
585 intel_uc_runtime_suspend(uc);
586 }
587
__uc_resume(struct intel_uc * uc,bool enable_communication)588 static int __uc_resume(struct intel_uc *uc, bool enable_communication)
589 {
590 struct intel_guc *guc = &uc->guc;
591 int err;
592
593 if (!intel_guc_is_running(guc))
594 return 0;
595
596 /* Make sure we enable communication if and only if it's disabled */
597 GEM_BUG_ON(enable_communication == guc_communication_enabled(guc));
598
599 if (enable_communication)
600 guc_enable_communication(guc);
601
602 err = intel_guc_resume(guc);
603 if (err) {
604 DRM_DEBUG_DRIVER("Failed to resume GuC, err=%d", err);
605 return err;
606 }
607
608 return 0;
609 }
610
intel_uc_resume(struct intel_uc * uc)611 int intel_uc_resume(struct intel_uc *uc)
612 {
613 /*
614 * When coming out of S3/S4 we sanitize and re-init the HW, so
615 * communication is already re-enabled at this point.
616 */
617 return __uc_resume(uc, false);
618 }
619
intel_uc_runtime_resume(struct intel_uc * uc)620 int intel_uc_runtime_resume(struct intel_uc *uc)
621 {
622 /*
623 * During runtime resume we don't sanitize, so we need to re-init
624 * communication as well.
625 */
626 return __uc_resume(uc, true);
627 }
628