summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a
diff options
context:
space:
mode:
authorMahantesh Kumbar <mkumbar@nvidia.com>2016-11-11 00:34:04 -0500
committermobile promotions <svcmobile_promotions@nvidia.com>2017-01-16 07:53:38 -0500
commitbb5a9e1c6cfbe69b8a984439a092db7a1a75a405 (patch)
tree8f6dfd5d8a031e0ca405c73b47c100919b5b483e /drivers/gpu/nvgpu/gk20a
parentc8d82d465c03b4d7e18ab1ba1bfce6581d2aad6e (diff)
gpu: nvgpu: PG sysfs update for RPPG/MSCG
- Added sysfs node to control RPPG/MSCG enable/disable - RPPG is controlled with elpg_enable node, same node used to control ELPG. - MSCG is controlled with mscg_enable node JIRA DNVGPU-71 Change-Id: I1a1b33d7425c25c9cfd466f7cabce08f3152326d Signed-off-by: Mahantesh Kumbar <mkumbar@nvidia.com> Reviewed-on: http://git-master/r/1251611 (cherry picked from commit eaf255f2dd3d20c071714dd509a785e9172399bf) Reviewed-on: http://git-master/r/1274645 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: svccoveritychecker <svccoveritychecker@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: Vijayakumar Subbu <vsubbu@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a')
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a_sysfs.c75
1 files changed, 72 insertions, 3 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a_sysfs.c b/drivers/gpu/nvgpu/gk20a/gk20a_sysfs.c
index 307fb681..9bf6acec 100644
--- a/drivers/gpu/nvgpu/gk20a/gk20a_sysfs.c
+++ b/drivers/gpu/nvgpu/gk20a/gk20a_sysfs.c
@@ -454,10 +454,19 @@ static ssize_t elpg_enable_store(struct device *dev,
454 */ 454 */
455 if (val && !g->elpg_enabled) { 455 if (val && !g->elpg_enabled) {
456 g->elpg_enabled = true; 456 g->elpg_enabled = true;
457 gk20a_pmu_enable_elpg(g); 457 gk20a_pmu_pg_global_enable(g, true);
458
458 } else if (!val && g->elpg_enabled) { 459 } else if (!val && g->elpg_enabled) {
459 g->elpg_enabled = false; 460 if (g->ops.pmu.pmu_pg_engines_feature_list &&
460 gk20a_pmu_disable_elpg(g); 461 g->ops.pmu.pmu_pg_engines_feature_list(g,
462 PMU_PG_ELPG_ENGINE_ID_GRAPHICS) !=
463 PMU_PG_FEATURE_GR_POWER_GATING_ENABLED) {
464 gk20a_pmu_pg_global_enable(g, false);
465 g->elpg_enabled = false;
466 } else {
467 g->elpg_enabled = false;
468 gk20a_pmu_pg_global_enable(g, false);
469 }
461 } 470 }
462 gk20a_idle(g->dev); 471 gk20a_idle(g->dev);
463 } 472 }
@@ -477,6 +486,64 @@ static ssize_t elpg_enable_read(struct device *dev,
477 486
478static DEVICE_ATTR(elpg_enable, ROOTRW, elpg_enable_read, elpg_enable_store); 487static DEVICE_ATTR(elpg_enable, ROOTRW, elpg_enable_read, elpg_enable_store);
479 488
489static ssize_t mscg_enable_store(struct device *dev,
490 struct device_attribute *attr, const char *buf, size_t count)
491{
492 struct gk20a *g = get_gk20a(dev);
493 struct pmu_gk20a *pmu = &g->pmu;
494 unsigned long val = 0;
495 int err;
496
497 if (kstrtoul(buf, 10, &val) < 0)
498 return -EINVAL;
499
500 if (!g->power_on) {
501 g->mscg_enabled = val ? true : false;
502 } else {
503 err = gk20a_busy(g->dev);
504 if (err)
505 return -EAGAIN;
506 /*
507 * Since elpg is refcounted, we should not unnecessarily call
508 * enable/disable if it is already so.
509 */
510 if (val && !g->mscg_enabled) {
511 g->mscg_enabled = true;
512 if (g->ops.pmu.pmu_is_lpwr_feature_supported(g,
513 PMU_PG_LPWR_FEATURE_MSCG)) {
514 if (!pmu->mscg_stat)
515 pmu->mscg_stat = PMU_MSCG_ENABLED;
516 }
517
518 } else if (!val && g->mscg_enabled) {
519 if (g->ops.pmu.pmu_is_lpwr_feature_supported(g,
520 PMU_PG_LPWR_FEATURE_MSCG)) {
521 gk20a_pmu_pg_global_enable(g, false);
522 pmu->mscg_stat = PMU_MSCG_DISABLED;
523 g->mscg_enabled = false;
524 if (g->elpg_enabled)
525 gk20a_pmu_pg_global_enable(g, true);
526 }
527 g->mscg_enabled = false;
528 }
529 gk20a_idle(g->dev);
530 }
531 dev_info(dev, "MSCG is %s.\n", g->mscg_enabled ? "enabled" :
532 "disabled");
533
534 return count;
535}
536
537static ssize_t mscg_enable_read(struct device *dev,
538 struct device_attribute *attr, char *buf)
539{
540 struct gk20a *g = get_gk20a(dev);
541
542 return snprintf(buf, PAGE_SIZE, "%d\n", g->mscg_enabled ? 1 : 0);
543}
544
545static DEVICE_ATTR(mscg_enable, ROOTRW, mscg_enable_read, mscg_enable_store);
546
480static ssize_t aelpg_param_store(struct device *dev, 547static ssize_t aelpg_param_store(struct device *dev,
481 struct device_attribute *attr, const char *buf, size_t count) 548 struct device_attribute *attr, const char *buf, size_t count)
482{ 549{
@@ -824,6 +891,7 @@ void gk20a_remove_sysfs(struct device *dev)
824 device_remove_file(dev, &dev_attr_ptimer_ref_freq); 891 device_remove_file(dev, &dev_attr_ptimer_ref_freq);
825 device_remove_file(dev, &dev_attr_ptimer_src_freq); 892 device_remove_file(dev, &dev_attr_ptimer_src_freq);
826 device_remove_file(dev, &dev_attr_elpg_enable); 893 device_remove_file(dev, &dev_attr_elpg_enable);
894 device_remove_file(dev, &dev_attr_mscg_enable);
827 device_remove_file(dev, &dev_attr_emc3d_ratio); 895 device_remove_file(dev, &dev_attr_emc3d_ratio);
828 device_remove_file(dev, &dev_attr_fmax_at_vmin_safe); 896 device_remove_file(dev, &dev_attr_fmax_at_vmin_safe);
829 device_remove_file(dev, &dev_attr_counters); 897 device_remove_file(dev, &dev_attr_counters);
@@ -866,6 +934,7 @@ void gk20a_create_sysfs(struct device *dev)
866 error |= device_create_file(dev, &dev_attr_ptimer_ref_freq); 934 error |= device_create_file(dev, &dev_attr_ptimer_ref_freq);
867 error |= device_create_file(dev, &dev_attr_ptimer_src_freq); 935 error |= device_create_file(dev, &dev_attr_ptimer_src_freq);
868 error |= device_create_file(dev, &dev_attr_elpg_enable); 936 error |= device_create_file(dev, &dev_attr_elpg_enable);
937 error |= device_create_file(dev, &dev_attr_mscg_enable);
869 error |= device_create_file(dev, &dev_attr_emc3d_ratio); 938 error |= device_create_file(dev, &dev_attr_emc3d_ratio);
870 error |= device_create_file(dev, &dev_attr_fmax_at_vmin_safe); 939 error |= device_create_file(dev, &dev_attr_fmax_at_vmin_safe);
871 error |= device_create_file(dev, &dev_attr_counters); 940 error |= device_create_file(dev, &dev_attr_counters);