Commit 0d2d2010 authored by Ashutosh Dixit's avatar Ashutosh Dixit Committed by Rodrigo Vivi

drm/i915: Perf_limit_reasons are only available for Gen11+

Register GT0_PERF_LIMIT_REASONS (0x1381a8) is available only for
Gen11+. Therefore ensure perf_limit_reasons sysfs/debugfs files are created
only for Gen11+. Otherwise on Gen < 5 accessing these files results in the
following oops:

<1> [88.829420] BUG: unable to handle page fault for address: ffffc90000bb81a8
<1> [88.829438] #PF: supervisor read access in kernel mode
<1> [88.829447] #PF: error_code(0x0000) - not-present page

Bspec: 20008
Bug: https://gitlab.freedesktop.org/drm/intel/-/issues/6863
Fixes: fe597966 ("drm/i915/debugfs: Add perf_limit_reasons in debugfs")
Fixes: fa68bff7 ("drm/i915/gt: Add sysfs throttle frequency interfaces")
Signed-off-by: default avatarAshutosh Dixit <ashutosh.dixit@intel.com>
Reviewed-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220919162401.2077713-1-ashutosh.dixit@intel.com
parent ad3aa7c3
...@@ -232,6 +232,10 @@ static void gen6_clear_engine_error_register(struct intel_engine_cs *engine) ...@@ -232,6 +232,10 @@ static void gen6_clear_engine_error_register(struct intel_engine_cs *engine)
i915_reg_t intel_gt_perf_limit_reasons_reg(struct intel_gt *gt) i915_reg_t intel_gt_perf_limit_reasons_reg(struct intel_gt *gt)
{ {
/* GT0_PERF_LIMIT_REASONS is available only for Gen11+ */
if (GRAPHICS_VER(gt->i915) < 11)
return INVALID_MMIO_REG;
return gt->type == GT_MEDIA ? return gt->type == GT_MEDIA ?
MTL_MEDIA_PERF_LIMIT_REASONS : GT0_PERF_LIMIT_REASONS; MTL_MEDIA_PERF_LIMIT_REASONS : GT0_PERF_LIMIT_REASONS;
} }
......
...@@ -682,6 +682,14 @@ static int perf_limit_reasons_clear(void *data, u64 val) ...@@ -682,6 +682,14 @@ static int perf_limit_reasons_clear(void *data, u64 val)
return 0; return 0;
} }
static bool perf_limit_reasons_eval(void *data)
{
struct intel_gt *gt = data;
return i915_mmio_reg_valid(intel_gt_perf_limit_reasons_reg(gt));
}
DEFINE_SIMPLE_ATTRIBUTE(perf_limit_reasons_fops, perf_limit_reasons_get, DEFINE_SIMPLE_ATTRIBUTE(perf_limit_reasons_fops, perf_limit_reasons_get,
perf_limit_reasons_clear, "%llu\n"); perf_limit_reasons_clear, "%llu\n");
...@@ -694,7 +702,7 @@ void intel_gt_pm_debugfs_register(struct intel_gt *gt, struct dentry *root) ...@@ -694,7 +702,7 @@ void intel_gt_pm_debugfs_register(struct intel_gt *gt, struct dentry *root)
{ "forcewake_user", &forcewake_user_fops, NULL}, { "forcewake_user", &forcewake_user_fops, NULL},
{ "llc", &llc_fops, llc_eval }, { "llc", &llc_fops, llc_eval },
{ "rps_boost", &rps_boost_fops, rps_eval }, { "rps_boost", &rps_boost_fops, rps_eval },
{ "perf_limit_reasons", &perf_limit_reasons_fops, NULL }, { "perf_limit_reasons", &perf_limit_reasons_fops, perf_limit_reasons_eval },
}; };
intel_gt_debugfs_register_files(root, files, ARRAY_SIZE(files), gt); intel_gt_debugfs_register_files(root, files, ARRAY_SIZE(files), gt);
......
...@@ -545,8 +545,7 @@ static INTEL_GT_RPS_BOOL_ATTR_RO(throttle_reason_ratl, RATL_MASK); ...@@ -545,8 +545,7 @@ static INTEL_GT_RPS_BOOL_ATTR_RO(throttle_reason_ratl, RATL_MASK);
static INTEL_GT_RPS_BOOL_ATTR_RO(throttle_reason_vr_thermalert, VR_THERMALERT_MASK); static INTEL_GT_RPS_BOOL_ATTR_RO(throttle_reason_vr_thermalert, VR_THERMALERT_MASK);
static INTEL_GT_RPS_BOOL_ATTR_RO(throttle_reason_vr_tdc, VR_TDC_MASK); static INTEL_GT_RPS_BOOL_ATTR_RO(throttle_reason_vr_tdc, VR_TDC_MASK);
static const struct attribute *freq_attrs[] = { static const struct attribute *throttle_reason_attrs[] = {
&dev_attr_punit_req_freq_mhz.attr,
&attr_throttle_reason_status.attr, &attr_throttle_reason_status.attr,
&attr_throttle_reason_pl1.attr, &attr_throttle_reason_pl1.attr,
&attr_throttle_reason_pl2.attr, &attr_throttle_reason_pl2.attr,
...@@ -791,12 +790,20 @@ void intel_gt_sysfs_pm_init(struct intel_gt *gt, struct kobject *kobj) ...@@ -791,12 +790,20 @@ void intel_gt_sysfs_pm_init(struct intel_gt *gt, struct kobject *kobj)
if (!is_object_gt(kobj)) if (!is_object_gt(kobj))
return; return;
ret = sysfs_create_files(kobj, freq_attrs); ret = sysfs_create_file(kobj, &dev_attr_punit_req_freq_mhz.attr);
if (ret) if (ret)
drm_warn(&gt->i915->drm, drm_warn(&gt->i915->drm,
"failed to create gt%u throttle sysfs files (%pe)", "failed to create gt%u punit_req_freq_mhz sysfs (%pe)",
gt->info.id, ERR_PTR(ret)); gt->info.id, ERR_PTR(ret));
if (i915_mmio_reg_valid(intel_gt_perf_limit_reasons_reg(gt))) {
ret = sysfs_create_files(kobj, throttle_reason_attrs);
if (ret)
drm_warn(&gt->i915->drm,
"failed to create gt%u throttle sysfs files (%pe)",
gt->info.id, ERR_PTR(ret));
}
if (HAS_MEDIA_RATIO_MODE(gt->i915) && intel_uc_uses_guc_slpc(&gt->uc)) { if (HAS_MEDIA_RATIO_MODE(gt->i915) && intel_uc_uses_guc_slpc(&gt->uc)) {
ret = sysfs_create_files(kobj, media_perf_power_attrs); ret = sysfs_create_files(kobj, media_perf_power_attrs);
if (ret) if (ret)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment