diff options
author | Alex Frid <afrid@nvidia.com> | 2018-05-08 21:58:22 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2018-05-11 18:34:37 -0400 |
commit | 7a28547892bfa73d31c1423b33e98030840a4f6d (patch) | |
tree | 0c9f8c8dac79434d653a68ca933d2b3df750a779 /drivers/gpu/nvgpu/common/linux/sysfs.c | |
parent | 0732f4b83ee8f055155f25c876c870ff7d20ae99 (diff) |
gpu: nvgpu: Fix Gpu sysfs access to Fmax@Vmin
Currently gpu sysfs retrieves Fmax@Vmin by direct call into Tegra DVFS
driver that introduces compile time dependencies on CONFIG_TEGRA_DVFS.
In addition incorrect clock is used for DVFS information access.
Re-factored sysfs node to use generic GPU clock operation for Fmax@Vmin
read. This would fix a bug in target clock selection, and allows to
remove dependency of sysfs on CONFIG_TEGRA_DVFS.
Updated nvgpu_linux_get_fmax_at_vmin_safe operation itself so it can be
called on platforms that does not support Tegra DVFS, although 0 will
still be returned as Fmax@Vmin on such platforms.
Bug 2045903
Change-Id: I32cce25320df026288c82458c913b0cde9ad4f72
Signed-off-by: Alex Frid <afrid@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/1710924
Reviewed-by: Alex Waterman <alexw@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/common/linux/sysfs.c')
-rw-r--r-- | drivers/gpu/nvgpu/common/linux/sysfs.c | 17 |
1 files changed, 6 insertions, 11 deletions
diff --git a/drivers/gpu/nvgpu/common/linux/sysfs.c b/drivers/gpu/nvgpu/common/linux/sysfs.c index 1f6da803..e425e153 100644 --- a/drivers/gpu/nvgpu/common/linux/sysfs.c +++ b/drivers/gpu/nvgpu/common/linux/sysfs.c | |||
@@ -17,9 +17,6 @@ | |||
17 | #include <linux/device.h> | 17 | #include <linux/device.h> |
18 | #include <linux/pm_runtime.h> | 18 | #include <linux/pm_runtime.h> |
19 | #include <linux/fb.h> | 19 | #include <linux/fb.h> |
20 | #ifdef CONFIG_TEGRA_DVFS | ||
21 | #include <soc/tegra/tegra-dvfs.h> | ||
22 | #endif | ||
23 | 20 | ||
24 | #include <nvgpu/kmem.h> | 21 | #include <nvgpu/kmem.h> |
25 | #include <nvgpu/nvhost.h> | 22 | #include <nvgpu/nvhost.h> |
@@ -781,21 +778,19 @@ static ssize_t emc3d_ratio_read(struct device *dev, | |||
781 | 778 | ||
782 | static DEVICE_ATTR(emc3d_ratio, ROOTRW, emc3d_ratio_read, emc3d_ratio_store); | 779 | static DEVICE_ATTR(emc3d_ratio, ROOTRW, emc3d_ratio_read, emc3d_ratio_store); |
783 | 780 | ||
784 | #ifdef CONFIG_TEGRA_DVFS | ||
785 | static ssize_t fmax_at_vmin_safe_read(struct device *dev, | 781 | static ssize_t fmax_at_vmin_safe_read(struct device *dev, |
786 | struct device_attribute *attr, char *buf) | 782 | struct device_attribute *attr, char *buf) |
787 | { | 783 | { |
788 | struct gk20a *g = get_gk20a(dev); | 784 | struct gk20a *g = get_gk20a(dev); |
789 | unsigned long gpu_fmax_at_vmin_hz = 0; | 785 | unsigned long gpu_fmax_at_vmin_hz = 0; |
790 | struct clk *clk = g->clk.tegra_clk; | ||
791 | 786 | ||
792 | gpu_fmax_at_vmin_hz = tegra_dvfs_get_fmax_at_vmin_safe_t(clk); | 787 | if (g->ops.clk.get_fmax_at_vmin_safe) |
788 | gpu_fmax_at_vmin_hz = g->ops.clk.get_fmax_at_vmin_safe(g); | ||
793 | 789 | ||
794 | return snprintf(buf, PAGE_SIZE, "%d\n", (int)(gpu_fmax_at_vmin_hz)); | 790 | return snprintf(buf, PAGE_SIZE, "%d\n", (int)(gpu_fmax_at_vmin_hz)); |
795 | } | 791 | } |
796 | 792 | ||
797 | static DEVICE_ATTR(fmax_at_vmin_safe, S_IRUGO, fmax_at_vmin_safe_read, NULL); | 793 | static DEVICE_ATTR(fmax_at_vmin_safe, S_IRUGO, fmax_at_vmin_safe_read, NULL); |
798 | #endif | ||
799 | 794 | ||
800 | #ifdef CONFIG_PM | 795 | #ifdef CONFIG_PM |
801 | static ssize_t force_idle_store(struct device *dev, | 796 | static ssize_t force_idle_store(struct device *dev, |
@@ -1116,9 +1111,9 @@ void nvgpu_remove_sysfs(struct device *dev) | |||
1116 | device_remove_file(dev, &dev_attr_elpg_enable); | 1111 | device_remove_file(dev, &dev_attr_elpg_enable); |
1117 | device_remove_file(dev, &dev_attr_mscg_enable); | 1112 | device_remove_file(dev, &dev_attr_mscg_enable); |
1118 | device_remove_file(dev, &dev_attr_emc3d_ratio); | 1113 | device_remove_file(dev, &dev_attr_emc3d_ratio); |
1119 | #ifdef CONFIG_TEGRA_DVFS | 1114 | |
1120 | device_remove_file(dev, &dev_attr_fmax_at_vmin_safe); | 1115 | device_remove_file(dev, &dev_attr_fmax_at_vmin_safe); |
1121 | #endif | 1116 | |
1122 | device_remove_file(dev, &dev_attr_counters); | 1117 | device_remove_file(dev, &dev_attr_counters); |
1123 | device_remove_file(dev, &dev_attr_counters_reset); | 1118 | device_remove_file(dev, &dev_attr_counters_reset); |
1124 | device_remove_file(dev, &dev_attr_load); | 1119 | device_remove_file(dev, &dev_attr_load); |
@@ -1167,9 +1162,9 @@ int nvgpu_create_sysfs(struct device *dev) | |||
1167 | error |= device_create_file(dev, &dev_attr_mscg_enable); | 1162 | error |= device_create_file(dev, &dev_attr_mscg_enable); |
1168 | error |= device_create_file(dev, &dev_attr_emc3d_ratio); | 1163 | error |= device_create_file(dev, &dev_attr_emc3d_ratio); |
1169 | error |= device_create_file(dev, &dev_attr_ldiv_slowdown_factor); | 1164 | error |= device_create_file(dev, &dev_attr_ldiv_slowdown_factor); |
1170 | #ifdef CONFIG_TEGRA_DVFS | 1165 | |
1171 | error |= device_create_file(dev, &dev_attr_fmax_at_vmin_safe); | 1166 | error |= device_create_file(dev, &dev_attr_fmax_at_vmin_safe); |
1172 | #endif | 1167 | |
1173 | error |= device_create_file(dev, &dev_attr_counters); | 1168 | error |= device_create_file(dev, &dev_attr_counters); |
1174 | error |= device_create_file(dev, &dev_attr_counters_reset); | 1169 | error |= device_create_file(dev, &dev_attr_counters_reset); |
1175 | error |= device_create_file(dev, &dev_attr_load); | 1170 | error |= device_create_file(dev, &dev_attr_load); |