Skip to content

Commit 4de4a0f

Browse files
committed
Merge tag 'drm-xe-fixes-2024-09-05' of https://gitlab.freedesktop.org/drm/xe/kernel into drm-fixes
- GSC loading fix (Daniele) - PCODE mutex fix (Matt) - Suspend/Resume fixes (Maarten, Imre) - RPM fixes (Rodrigo) Signed-off-by: Dave Airlie <[email protected]> From: Rodrigo Vivi <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
2 parents f2064ae + 4bfc9c5 commit 4de4a0f

File tree

14 files changed

+124
-89
lines changed

14 files changed

+124
-89
lines changed

drivers/gpu/drm/xe/compat-i915-headers/intel_pcode.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,29 +13,29 @@ static inline int
1313
snb_pcode_write_timeout(struct intel_uncore *uncore, u32 mbox, u32 val,
1414
int fast_timeout_us, int slow_timeout_ms)
1515
{
16-
return xe_pcode_write_timeout(__compat_uncore_to_gt(uncore), mbox, val,
16+
return xe_pcode_write_timeout(__compat_uncore_to_tile(uncore), mbox, val,
1717
slow_timeout_ms ?: 1);
1818
}
1919

2020
static inline int
2121
snb_pcode_write(struct intel_uncore *uncore, u32 mbox, u32 val)
2222
{
2323

24-
return xe_pcode_write(__compat_uncore_to_gt(uncore), mbox, val);
24+
return xe_pcode_write(__compat_uncore_to_tile(uncore), mbox, val);
2525
}
2626

2727
static inline int
2828
snb_pcode_read(struct intel_uncore *uncore, u32 mbox, u32 *val, u32 *val1)
2929
{
30-
return xe_pcode_read(__compat_uncore_to_gt(uncore), mbox, val, val1);
30+
return xe_pcode_read(__compat_uncore_to_tile(uncore), mbox, val, val1);
3131
}
3232

3333
static inline int
3434
skl_pcode_request(struct intel_uncore *uncore, u32 mbox,
3535
u32 request, u32 reply_mask, u32 reply,
3636
int timeout_base_ms)
3737
{
38-
return xe_pcode_request(__compat_uncore_to_gt(uncore), mbox, request, reply_mask, reply,
38+
return xe_pcode_request(__compat_uncore_to_tile(uncore), mbox, request, reply_mask, reply,
3939
timeout_base_ms);
4040
}
4141

drivers/gpu/drm/xe/compat-i915-headers/intel_uncore.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@ static inline struct xe_gt *__compat_uncore_to_gt(struct intel_uncore *uncore)
1717
return xe_root_mmio_gt(xe);
1818
}
1919

20+
static inline struct xe_tile *__compat_uncore_to_tile(struct intel_uncore *uncore)
21+
{
22+
struct xe_device *xe = container_of(uncore, struct xe_device, uncore);
23+
24+
return xe_device_get_root_tile(xe);
25+
}
26+
2027
static inline u32 intel_uncore_read(struct intel_uncore *uncore,
2128
i915_reg_t i915_reg)
2229
{

drivers/gpu/drm/xe/display/xe_display.c

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -315,8 +315,12 @@ void xe_display_pm_suspend(struct xe_device *xe, bool runtime)
315315
* properly.
316316
*/
317317
intel_power_domains_disable(xe);
318-
if (has_display(xe))
318+
intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_SUSPENDED, true);
319+
if (has_display(xe)) {
319320
drm_kms_helper_poll_disable(&xe->drm);
321+
if (!runtime)
322+
intel_display_driver_disable_user_access(xe);
323+
}
320324

321325
if (!runtime)
322326
intel_display_driver_suspend(xe);
@@ -327,12 +331,13 @@ void xe_display_pm_suspend(struct xe_device *xe, bool runtime)
327331

328332
intel_hpd_cancel_work(xe);
329333

330-
intel_encoder_suspend_all(&xe->display);
334+
if (!runtime && has_display(xe)) {
335+
intel_display_driver_suspend_access(xe);
336+
intel_encoder_suspend_all(&xe->display);
337+
}
331338

332339
intel_opregion_suspend(xe, s2idle ? PCI_D1 : PCI_D3cold);
333340

334-
intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_SUSPENDED, true);
335-
336341
intel_dmc_suspend(xe);
337342
}
338343

@@ -370,14 +375,20 @@ void xe_display_pm_resume(struct xe_device *xe, bool runtime)
370375
intel_display_driver_init_hw(xe);
371376
intel_hpd_init(xe);
372377

378+
if (!runtime && has_display(xe))
379+
intel_display_driver_resume_access(xe);
380+
373381
/* MST sideband requires HPD interrupts enabled */
374382
intel_dp_mst_resume(xe);
375383
if (!runtime)
376384
intel_display_driver_resume(xe);
377385

378-
intel_hpd_poll_disable(xe);
379-
if (has_display(xe))
386+
if (has_display(xe)) {
380387
drm_kms_helper_poll_enable(&xe->drm);
388+
if (!runtime)
389+
intel_display_driver_enable_user_access(xe);
390+
}
391+
intel_hpd_poll_disable(xe);
381392

382393
intel_opregion_resume(xe);
383394

drivers/gpu/drm/xe/xe_device_types.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,12 @@ struct xe_tile {
203203
} vf;
204204
} sriov;
205205

206+
/** @pcode: tile's PCODE */
207+
struct {
208+
/** @pcode.lock: protecting tile's PCODE mailbox data */
209+
struct mutex lock;
210+
} pcode;
211+
206212
/** @migrate: Migration helper for vram blits and clearing */
207213
struct xe_migrate *migrate;
208214

drivers/gpu/drm/xe/xe_gsc.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,10 +519,22 @@ int xe_gsc_init_post_hwconfig(struct xe_gsc *gsc)
519519
void xe_gsc_load_start(struct xe_gsc *gsc)
520520
{
521521
struct xe_gt *gt = gsc_to_gt(gsc);
522+
struct xe_device *xe = gt_to_xe(gt);
522523

523524
if (!xe_uc_fw_is_loadable(&gsc->fw) || !gsc->q)
524525
return;
525526

527+
/*
528+
* The GSC HW is only reset by driver FLR or D3cold entry. We don't
529+
* support the former at runtime, while the latter is only supported on
530+
* DGFX, for which we don't support GSC. Therefore, if GSC failed to
531+
* load previously there is no need to try again because the HW is
532+
* stuck in the error state.
533+
*/
534+
xe_assert(xe, !IS_DGFX(xe));
535+
if (xe_uc_fw_is_in_error_state(&gsc->fw))
536+
return;
537+
526538
/* GSC FW survives GT reset and D3Hot */
527539
if (gsc_fw_is_loaded(gt)) {
528540
xe_uc_fw_change_status(&gsc->fw, XE_UC_FIRMWARE_TRANSFERRED);

drivers/gpu/drm/xe/xe_gt.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
#include "xe_migrate.h"
4848
#include "xe_mmio.h"
4949
#include "xe_pat.h"
50-
#include "xe_pcode.h"
5150
#include "xe_pm.h"
5251
#include "xe_mocs.h"
5352
#include "xe_reg_sr.h"
@@ -387,7 +386,6 @@ int xe_gt_init_early(struct xe_gt *gt)
387386
xe_tuning_process_gt(gt);
388387

389388
xe_force_wake_init_gt(gt, gt_to_fw(gt));
390-
xe_pcode_init(gt);
391389
spin_lock_init(&gt->global_invl_lock);
392390

393391
return 0;
@@ -755,12 +753,13 @@ static int gt_reset(struct xe_gt *gt)
755753

756754
xe_gt_info(gt, "reset started\n");
757755

756+
xe_pm_runtime_get(gt_to_xe(gt));
757+
758758
if (xe_fault_inject_gt_reset()) {
759759
err = -ECANCELED;
760760
goto err_fail;
761761
}
762762

763-
xe_pm_runtime_get(gt_to_xe(gt));
764763
xe_gt_sanitize(gt);
765764

766765
err = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
@@ -795,11 +794,11 @@ static int gt_reset(struct xe_gt *gt)
795794
XE_WARN_ON(xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL));
796795
err_msg:
797796
XE_WARN_ON(xe_uc_start(&gt->uc));
798-
xe_pm_runtime_put(gt_to_xe(gt));
799797
err_fail:
800798
xe_gt_err(gt, "reset failed (%pe)\n", ERR_PTR(err));
801799

802800
xe_device_declare_wedged(gt_to_xe(gt));
801+
xe_pm_runtime_put(gt_to_xe(gt));
803802

804803
return err;
805804
}

drivers/gpu/drm/xe/xe_gt_types.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -310,12 +310,6 @@ struct xe_gt {
310310
/** @eclass: per hardware engine class interface on the GT */
311311
struct xe_hw_engine_class_intf eclass[XE_ENGINE_CLASS_MAX];
312312

313-
/** @pcode: GT's PCODE */
314-
struct {
315-
/** @pcode.lock: protecting GT's PCODE mailbox data */
316-
struct mutex lock;
317-
} pcode;
318-
319313
/** @sysfs: sysfs' kobj used by xe_gt_sysfs */
320314
struct kobject *sysfs;
321315

drivers/gpu/drm/xe/xe_guc_pc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -915,7 +915,7 @@ static void pc_init_pcode_freq(struct xe_guc_pc *pc)
915915
u32 min = DIV_ROUND_CLOSEST(pc->rpn_freq, GT_FREQUENCY_MULTIPLIER);
916916
u32 max = DIV_ROUND_CLOSEST(pc->rp0_freq, GT_FREQUENCY_MULTIPLIER);
917917

918-
XE_WARN_ON(xe_pcode_init_min_freq_table(pc_to_gt(pc), min, max));
918+
XE_WARN_ON(xe_pcode_init_min_freq_table(gt_to_tile(pc_to_gt(pc)), min, max));
919919
}
920920

921921
static int pc_init_freqs(struct xe_guc_pc *pc)

drivers/gpu/drm/xe/xe_hwmon.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -441,14 +441,14 @@ static int xe_hwmon_pcode_read_i1(struct xe_gt *gt, u32 *uval)
441441
if (gt_to_xe(gt)->info.platform == XE_DG2)
442442
return -ENXIO;
443443

444-
return xe_pcode_read(gt, PCODE_MBOX(PCODE_POWER_SETUP,
444+
return xe_pcode_read(gt_to_tile(gt), PCODE_MBOX(PCODE_POWER_SETUP,
445445
POWER_SETUP_SUBCOMMAND_READ_I1, 0),
446446
uval, NULL);
447447
}
448448

449449
static int xe_hwmon_pcode_write_i1(struct xe_gt *gt, u32 uval)
450450
{
451-
return xe_pcode_write(gt, PCODE_MBOX(PCODE_POWER_SETUP,
451+
return xe_pcode_write(gt_to_tile(gt), PCODE_MBOX(PCODE_POWER_SETUP,
452452
POWER_SETUP_SUBCOMMAND_WRITE_I1, 0),
453453
(uval & POWER_SETUP_I1_DATA_MASK));
454454
}

0 commit comments

Comments
 (0)