Skip to content

Commit 4bb9ca7

Browse files
bnilawarrodrigovivi
authored andcommitted
drm/i915/mtl: C6 residency and C state type for MTL SAMedia
Add support for C6 residency and C state type for MTL SAMedia. Also add mtl_drpc. v2: Fixed review comments (Ashutosh) v3: Sort registers and fix whitespace errors in intel_gt_regs.h (Matt R) Remove MTL_CC_SHIFT (Ashutosh) Adapt to RC6 residency register code refactor (Jani N) v4: Move MTL branch to top in drpc_show v5: Use FORCEWAKE_MT identical to gen6_drpc (Ashutosh) v6: Add MISSING_CASE for gt_core_status switch statement (Rodrigo) Change state name for MTL_CC0 to C0 (from "on") (Rodrigo) v7: Change state name for MTL_CC0 to RC0 (Rodrigo) Signed-off-by: Ashutosh Dixit <[email protected]> Signed-off-by: Badal Nilawar <[email protected]> Reviewed-by: Rodrigo Vivi <[email protected]> Signed-off-by: Rodrigo Vivi <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 78d0b45 commit 4bb9ca7

File tree

3 files changed

+76
-5
lines changed

3 files changed

+76
-5
lines changed

drivers/gpu/drm/i915/gt/intel_gt_pm_debugfs.c

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,61 @@ static int ilk_drpc(struct seq_file *m)
256256
return 0;
257257
}
258258

259+
static int mtl_drpc(struct seq_file *m)
260+
{
261+
struct intel_gt *gt = m->private;
262+
struct intel_uncore *uncore = gt->uncore;
263+
u32 gt_core_status, rcctl1, mt_fwake_req;
264+
u32 mtl_powergate_enable = 0, mtl_powergate_status = 0;
265+
266+
mt_fwake_req = intel_uncore_read_fw(uncore, FORCEWAKE_MT);
267+
gt_core_status = intel_uncore_read(uncore, MTL_MIRROR_TARGET_WP1);
268+
269+
rcctl1 = intel_uncore_read(uncore, GEN6_RC_CONTROL);
270+
mtl_powergate_enable = intel_uncore_read(uncore, GEN9_PG_ENABLE);
271+
mtl_powergate_status = intel_uncore_read(uncore,
272+
GEN9_PWRGT_DOMAIN_STATUS);
273+
274+
seq_printf(m, "RC6 Enabled: %s\n",
275+
str_yes_no(rcctl1 & GEN6_RC_CTL_RC6_ENABLE));
276+
if (gt->type == GT_MEDIA) {
277+
seq_printf(m, "Media Well Gating Enabled: %s\n",
278+
str_yes_no(mtl_powergate_enable & GEN9_MEDIA_PG_ENABLE));
279+
} else {
280+
seq_printf(m, "Render Well Gating Enabled: %s\n",
281+
str_yes_no(mtl_powergate_enable & GEN9_RENDER_PG_ENABLE));
282+
}
283+
284+
seq_puts(m, "Current RC state: ");
285+
switch (REG_FIELD_GET(MTL_CC_MASK, gt_core_status)) {
286+
case MTL_CC0:
287+
seq_puts(m, "RC0\n");
288+
break;
289+
case MTL_CC6:
290+
seq_puts(m, "RC6\n");
291+
break;
292+
default:
293+
MISSING_CASE(REG_FIELD_GET(MTL_CC_MASK, gt_core_status));
294+
seq_puts(m, "Unknown\n");
295+
break;
296+
}
297+
298+
seq_printf(m, "Multi-threaded Forcewake Request: 0x%x\n", mt_fwake_req);
299+
if (gt->type == GT_MEDIA)
300+
seq_printf(m, "Media Power Well: %s\n",
301+
(mtl_powergate_status &
302+
GEN9_PWRGT_MEDIA_STATUS_MASK) ? "Up" : "Down");
303+
else
304+
seq_printf(m, "Render Power Well: %s\n",
305+
(mtl_powergate_status &
306+
GEN9_PWRGT_RENDER_STATUS_MASK) ? "Up" : "Down");
307+
308+
/* Works for both render and media gt's */
309+
intel_rc6_print_residency(m, "RC6 residency since boot:", INTEL_RC6_RES_RC6);
310+
311+
return fw_domains_show(m, NULL);
312+
}
313+
259314
static int drpc_show(struct seq_file *m, void *unused)
260315
{
261316
struct intel_gt *gt = m->private;
@@ -264,7 +319,9 @@ static int drpc_show(struct seq_file *m, void *unused)
264319
int err = -ENODEV;
265320

266321
with_intel_runtime_pm(gt->uncore->rpm, wakeref) {
267-
if (IS_VALLEYVIEW(i915) || IS_CHERRYVIEW(i915))
322+
if (GRAPHICS_VER_FULL(i915) >= IP_VER(12, 70))
323+
err = mtl_drpc(m);
324+
else if (IS_VALLEYVIEW(i915) || IS_CHERRYVIEW(i915))
268325
err = vlv_drpc(m);
269326
else if (GRAPHICS_VER(i915) >= 6)
270327
err = gen6_drpc(m);

drivers/gpu/drm/i915/gt/intel_gt_regs.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
/* MTL workpoint reg to get core C state and actual freq of 3D, SAMedia */
2525
#define MTL_MIRROR_TARGET_WP1 _MMIO(0xc60)
2626
#define MTL_CAGF_MASK REG_GENMASK(8, 0)
27+
#define MTL_CC0 0x0
28+
#define MTL_CC6 0x3
29+
#define MTL_CC_MASK REG_GENMASK(12, 9)
2730

2831
/* RPM unit config (Gen8+) */
2932
#define RPM_CONFIG0 _MMIO(0xd00)
@@ -1518,6 +1521,8 @@
15181521
#define FORCEWAKE_MEDIA_VLV _MMIO(0x1300b8)
15191522
#define FORCEWAKE_ACK_MEDIA_VLV _MMIO(0x1300bc)
15201523

1524+
#define MTL_MEDIA_MC6 _MMIO(0x138048)
1525+
15211526
#define GEN6_GT_THREAD_STATUS_REG _MMIO(0x13805c)
15221527
#define GEN6_GT_THREAD_STATUS_CORE_MASK 0x7
15231528

drivers/gpu/drm/i915/gt/intel_rc6.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -553,10 +553,19 @@ static void __intel_rc6_disable(struct intel_rc6 *rc6)
553553

554554
static void rc6_res_reg_init(struct intel_rc6 *rc6)
555555
{
556-
rc6->res_reg[INTEL_RC6_RES_RC6_LOCKED] = GEN6_GT_GFX_RC6_LOCKED;
557-
rc6->res_reg[INTEL_RC6_RES_RC6] = GEN6_GT_GFX_RC6;
558-
rc6->res_reg[INTEL_RC6_RES_RC6p] = GEN6_GT_GFX_RC6p;
559-
rc6->res_reg[INTEL_RC6_RES_RC6pp] = GEN6_GT_GFX_RC6pp;
556+
memset(rc6->res_reg, INVALID_MMIO_REG.reg, sizeof(rc6->res_reg));
557+
558+
switch (rc6_to_gt(rc6)->type) {
559+
case GT_MEDIA:
560+
rc6->res_reg[INTEL_RC6_RES_RC6] = MTL_MEDIA_MC6;
561+
break;
562+
default:
563+
rc6->res_reg[INTEL_RC6_RES_RC6_LOCKED] = GEN6_GT_GFX_RC6_LOCKED;
564+
rc6->res_reg[INTEL_RC6_RES_RC6] = GEN6_GT_GFX_RC6;
565+
rc6->res_reg[INTEL_RC6_RES_RC6p] = GEN6_GT_GFX_RC6p;
566+
rc6->res_reg[INTEL_RC6_RES_RC6pp] = GEN6_GT_GFX_RC6pp;
567+
break;
568+
}
560569
}
561570

562571
void intel_rc6_init(struct intel_rc6 *rc6)

0 commit comments

Comments
 (0)