summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMahantesh Kumbar <mkumbar@nvidia.com>2014-07-09 04:51:50 -0400
committerDan Willemsen <dwillemsen@nvidia.com>2015-03-18 15:10:42 -0400
commitf5422f80f22fd29b3e2532fa6e43b7dbc1b910a7 (patch)
tree8aa65bb3f1a162db3faee643eca230edfb060cfd
parentb0759dc68d347ad3d02057923426c1feb2bab906 (diff)
gpu:nvgpu:sysfs node to enable/disable aelpg
Added "aelpg_enable" sysfs node to enable/disable aelpg. Bug 1464737 Change-Id: Ia0eadbea59e2f9373ab5f413fa6e28780aff3c3c Signed-off-by: Mahantesh Kumbar <mkumbar@nvidia.com>
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a_sysfs.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a_sysfs.c b/drivers/gpu/nvgpu/gk20a/gk20a_sysfs.c
index 2debe235..994c9cd2 100644
--- a/drivers/gpu/nvgpu/gk20a/gk20a_sysfs.c
+++ b/drivers/gpu/nvgpu/gk20a/gk20a_sysfs.c
@@ -389,6 +389,55 @@ static ssize_t aelpg_param_read(struct device *device,
389static DEVICE_ATTR(aelpg_param, S_IRWXUGO, 389static DEVICE_ATTR(aelpg_param, S_IRWXUGO,
390 aelpg_param_read, aelpg_param_store); 390 aelpg_param_read, aelpg_param_store);
391 391
392static ssize_t aelpg_enable_store(struct device *device,
393 struct device_attribute *attr, const char *buf, size_t count)
394{
395 struct platform_device *ndev = to_platform_device(device);
396 struct gk20a *g = get_gk20a(ndev);
397 unsigned long val = 0;
398 int status = 0;
399 union pmu_ap_cmd ap_cmd;
400 int err;
401
402 if (kstrtoul(buf, 10, &val) < 0)
403 return -EINVAL;
404
405 err = gk20a_busy(g->dev);
406 if (g->pmu.pmu_ready) {
407 if (val && !g->aelpg_enabled) {
408 g->aelpg_enabled = true;
409 /* Enable AELPG */
410 ap_cmd.init.cmd_id = PMU_AP_CMD_ID_ENABLE_CTRL;
411 status = gk20a_pmu_ap_send_command(g, &ap_cmd, false);
412 } else if (!val && g->aelpg_enabled) {
413 g->aelpg_enabled = false;
414 /* Disable AELPG */
415 ap_cmd.init.cmd_id = PMU_AP_CMD_ID_DISABLE_CTRL;
416 status = gk20a_pmu_ap_send_command(g, &ap_cmd, false);
417 }
418 } else {
419 dev_info(device, "PMU is not ready, AELPG request failed\n");
420 }
421 gk20a_idle(g->dev);
422
423 dev_info(device, "AELPG is %s.\n", g->aelpg_enabled ? "enabled" :
424 "disabled");
425
426 return count;
427}
428
429static ssize_t aelpg_enable_read(struct device *device,
430 struct device_attribute *attr, char *buf)
431{
432 struct platform_device *ndev = to_platform_device(device);
433 struct gk20a *g = get_gk20a(ndev);
434
435 return sprintf(buf, "%d\n", g->aelpg_enabled ? 1 : 0);
436}
437
438static DEVICE_ATTR(aelpg_enable, ROOTRW,
439 aelpg_enable_read, aelpg_enable_store);
440
392#ifdef CONFIG_PM_RUNTIME 441#ifdef CONFIG_PM_RUNTIME
393static ssize_t force_idle_store(struct device *device, 442static ssize_t force_idle_store(struct device *device,
394 struct device_attribute *attr, const char *buf, size_t count) 443 struct device_attribute *attr, const char *buf, size_t count)
@@ -458,6 +507,7 @@ void gk20a_remove_sysfs(struct device *dev)
458 device_remove_file(dev, &dev_attr_force_idle); 507 device_remove_file(dev, &dev_attr_force_idle);
459#endif 508#endif
460 device_remove_file(dev, &dev_attr_aelpg_param); 509 device_remove_file(dev, &dev_attr_aelpg_param);
510 device_remove_file(dev, &dev_attr_aelpg_enable);
461 511
462 if (g->host1x_dev && (dev->parent != &g->host1x_dev->dev)) 512 if (g->host1x_dev && (dev->parent != &g->host1x_dev->dev))
463 sysfs_remove_link(&dev->kobj, dev_name(dev)); 513 sysfs_remove_link(&dev->kobj, dev_name(dev));
@@ -482,6 +532,7 @@ void gk20a_create_sysfs(struct platform_device *dev)
482 error |= device_create_file(&dev->dev, &dev_attr_force_idle); 532 error |= device_create_file(&dev->dev, &dev_attr_force_idle);
483#endif 533#endif
484 error |= device_create_file(&dev->dev, &dev_attr_aelpg_param); 534 error |= device_create_file(&dev->dev, &dev_attr_aelpg_param);
535 error |= device_create_file(&dev->dev, &dev_attr_aelpg_enable);
485 536
486 if (g->host1x_dev && (dev->dev.parent != &g->host1x_dev->dev)) 537 if (g->host1x_dev && (dev->dev.parent != &g->host1x_dev->dev))
487 error |= sysfs_create_link(&g->host1x_dev->dev.kobj, 538 error |= sysfs_create_link(&g->host1x_dev->dev.kobj,