diff options
| -rw-r--r-- | drivers/gpu/drm/i915/i915_debugfs.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 0a893f7400fa..782b781df9e0 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
| @@ -1300,6 +1300,76 @@ static const struct file_operations i915_wedged_fops = { | |||
| 1300 | .llseek = default_llseek, | 1300 | .llseek = default_llseek, |
| 1301 | }; | 1301 | }; |
| 1302 | 1302 | ||
| 1303 | static int | ||
| 1304 | i915_max_freq_open(struct inode *inode, | ||
| 1305 | struct file *filp) | ||
| 1306 | { | ||
| 1307 | filp->private_data = inode->i_private; | ||
| 1308 | return 0; | ||
| 1309 | } | ||
| 1310 | |||
| 1311 | static ssize_t | ||
| 1312 | i915_max_freq_read(struct file *filp, | ||
| 1313 | char __user *ubuf, | ||
| 1314 | size_t max, | ||
| 1315 | loff_t *ppos) | ||
| 1316 | { | ||
| 1317 | struct drm_device *dev = filp->private_data; | ||
| 1318 | drm_i915_private_t *dev_priv = dev->dev_private; | ||
| 1319 | char buf[80]; | ||
| 1320 | int len; | ||
| 1321 | |||
| 1322 | len = snprintf(buf, sizeof (buf), | ||
| 1323 | "max freq: %d\n", dev_priv->max_delay * 50); | ||
| 1324 | |||
| 1325 | if (len > sizeof (buf)) | ||
| 1326 | len = sizeof (buf); | ||
| 1327 | |||
| 1328 | return simple_read_from_buffer(ubuf, max, ppos, buf, len); | ||
| 1329 | } | ||
| 1330 | |||
| 1331 | static ssize_t | ||
| 1332 | i915_max_freq_write(struct file *filp, | ||
| 1333 | const char __user *ubuf, | ||
| 1334 | size_t cnt, | ||
| 1335 | loff_t *ppos) | ||
| 1336 | { | ||
| 1337 | struct drm_device *dev = filp->private_data; | ||
| 1338 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 1339 | char buf[20]; | ||
| 1340 | int val = 1; | ||
| 1341 | |||
| 1342 | if (cnt > 0) { | ||
| 1343 | if (cnt > sizeof (buf) - 1) | ||
| 1344 | return -EINVAL; | ||
| 1345 | |||
| 1346 | if (copy_from_user(buf, ubuf, cnt)) | ||
| 1347 | return -EFAULT; | ||
| 1348 | buf[cnt] = 0; | ||
| 1349 | |||
| 1350 | val = simple_strtoul(buf, NULL, 0); | ||
| 1351 | } | ||
| 1352 | |||
| 1353 | DRM_DEBUG_DRIVER("Manually setting max freq to %d\n", val); | ||
| 1354 | |||
| 1355 | /* | ||
| 1356 | * Turbo will still be enabled, but won't go above the set value. | ||
| 1357 | */ | ||
| 1358 | dev_priv->max_delay = val / 50; | ||
| 1359 | |||
| 1360 | gen6_set_rps(dev, val / 50); | ||
| 1361 | |||
| 1362 | return cnt; | ||
| 1363 | } | ||
| 1364 | |||
| 1365 | static const struct file_operations i915_max_freq_fops = { | ||
| 1366 | .owner = THIS_MODULE, | ||
| 1367 | .open = i915_max_freq_open, | ||
| 1368 | .read = i915_max_freq_read, | ||
| 1369 | .write = i915_max_freq_write, | ||
| 1370 | .llseek = default_llseek, | ||
| 1371 | }; | ||
| 1372 | |||
| 1303 | /* As the drm_debugfs_init() routines are called before dev->dev_private is | 1373 | /* As the drm_debugfs_init() routines are called before dev->dev_private is |
| 1304 | * allocated we need to hook into the minor for release. */ | 1374 | * allocated we need to hook into the minor for release. */ |
| 1305 | static int | 1375 | static int |
| @@ -1399,6 +1469,21 @@ static int i915_forcewake_create(struct dentry *root, struct drm_minor *minor) | |||
| 1399 | return drm_add_fake_info_node(minor, ent, &i915_forcewake_fops); | 1469 | return drm_add_fake_info_node(minor, ent, &i915_forcewake_fops); |
| 1400 | } | 1470 | } |
| 1401 | 1471 | ||
| 1472 | static int i915_max_freq_create(struct dentry *root, struct drm_minor *minor) | ||
| 1473 | { | ||
| 1474 | struct drm_device *dev = minor->dev; | ||
| 1475 | struct dentry *ent; | ||
| 1476 | |||
| 1477 | ent = debugfs_create_file("i915_max_freq", | ||
| 1478 | S_IRUGO | S_IWUSR, | ||
| 1479 | root, dev, | ||
| 1480 | &i915_max_freq_fops); | ||
| 1481 | if (IS_ERR(ent)) | ||
| 1482 | return PTR_ERR(ent); | ||
| 1483 | |||
| 1484 | return drm_add_fake_info_node(minor, ent, &i915_max_freq_fops); | ||
| 1485 | } | ||
| 1486 | |||
| 1402 | static struct drm_info_list i915_debugfs_list[] = { | 1487 | static struct drm_info_list i915_debugfs_list[] = { |
| 1403 | {"i915_capabilities", i915_capabilities, 0}, | 1488 | {"i915_capabilities", i915_capabilities, 0}, |
| 1404 | {"i915_gem_objects", i915_gem_object_info, 0}, | 1489 | {"i915_gem_objects", i915_gem_object_info, 0}, |
| @@ -1451,6 +1536,9 @@ int i915_debugfs_init(struct drm_minor *minor) | |||
| 1451 | ret = i915_forcewake_create(minor->debugfs_root, minor); | 1536 | ret = i915_forcewake_create(minor->debugfs_root, minor); |
| 1452 | if (ret) | 1537 | if (ret) |
| 1453 | return ret; | 1538 | return ret; |
| 1539 | ret = i915_max_freq_create(minor->debugfs_root, minor); | ||
| 1540 | if (ret) | ||
| 1541 | return ret; | ||
| 1454 | 1542 | ||
| 1455 | return drm_debugfs_create_files(i915_debugfs_list, | 1543 | return drm_debugfs_create_files(i915_debugfs_list, |
| 1456 | I915_DEBUGFS_ENTRIES, | 1544 | I915_DEBUGFS_ENTRIES, |
| @@ -1465,6 +1553,8 @@ void i915_debugfs_cleanup(struct drm_minor *minor) | |||
| 1465 | 1, minor); | 1553 | 1, minor); |
| 1466 | drm_debugfs_remove_files((struct drm_info_list *) &i915_wedged_fops, | 1554 | drm_debugfs_remove_files((struct drm_info_list *) &i915_wedged_fops, |
| 1467 | 1, minor); | 1555 | 1, minor); |
| 1556 | drm_debugfs_remove_files((struct drm_info_list *) &i915_max_freq_fops, | ||
| 1557 | 1, minor); | ||
| 1468 | } | 1558 | } |
| 1469 | 1559 | ||
| 1470 | #endif /* CONFIG_DEBUG_FS */ | 1560 | #endif /* CONFIG_DEBUG_FS */ |
