diff options
author | Mahantesh Kumbar <mkumbar@nvidia.com> | 2016-11-11 00:34:04 -0500 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2017-01-16 07:53:38 -0500 |
commit | bb5a9e1c6cfbe69b8a984439a092db7a1a75a405 (patch) | |
tree | 8f6dfd5d8a031e0ca405c73b47c100919b5b483e /drivers/gpu | |
parent | c8d82d465c03b4d7e18ab1ba1bfce6581d2aad6e (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')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gk20a_sysfs.c | 75 |
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 | ||
478 | static DEVICE_ATTR(elpg_enable, ROOTRW, elpg_enable_read, elpg_enable_store); | 487 | static DEVICE_ATTR(elpg_enable, ROOTRW, elpg_enable_read, elpg_enable_store); |
479 | 488 | ||
489 | static 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 | |||
537 | static 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 | |||
545 | static DEVICE_ATTR(mscg_enable, ROOTRW, mscg_enable_read, mscg_enable_store); | ||
546 | |||
480 | static ssize_t aelpg_param_store(struct device *dev, | 547 | static 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); |