summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Fleury <tfleury@nvidia.com>2016-10-21 19:43:39 -0400
committerDeepak Nibade <dnibade@nvidia.com>2016-12-27 04:56:52 -0500
commit849c5317e8509b390da626bcb607e66cc5ef847f (patch)
treea50207bd32926991b1a482dd1de5a24c1d44b97f
parent5ab254c6e84d741f56e9bcc93512f82eb7ce518c (diff)
gpu: nvgpu: get voltage, current, power and temperature
Add ioctls to retrieve voltage, current, power and temperature. Add flags in GPU characteristics to indicate if feature is supported. Jira DNVGPU-166 Change-Id: Ifaafe2efdb6b09d7b28215b641814f28e894151e Signed-off-by: David Martinez Nieto <dmartineznie@nvidia.com> Reviewed-on: http://git-master/r/1241861 Tested-by: Thomas Fleury <tfleury@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-by: Vijayakumar Subbu <vsubbu@nvidia.com> Reviewed-on: http://git-master/r/1267122
-rw-r--r--drivers/gpu/nvgpu/gp106/hal_gp106.c20
-rw-r--r--drivers/gpu/nvgpu/gp106/therm_gp106.c21
-rw-r--r--drivers/gpu/nvgpu/pmgr/pmgr.c53
-rw-r--r--drivers/gpu/nvgpu/pmgr/pmgr.h3
-rw-r--r--drivers/gpu/nvgpu/volt/volt_pmu.c14
-rw-r--r--drivers/gpu/nvgpu/volt/volt_pmu.h2
6 files changed, 85 insertions, 28 deletions
diff --git a/drivers/gpu/nvgpu/gp106/hal_gp106.c b/drivers/gpu/nvgpu/gp106/hal_gp106.c
index dc27cdae..ee361953 100644
--- a/drivers/gpu/nvgpu/gp106/hal_gp106.c
+++ b/drivers/gpu/nvgpu/gp106/hal_gp106.c
@@ -187,6 +187,24 @@ static int gp106_get_litter_value(struct gk20a *g, int value)
187 return ret; 187 return ret;
188} 188}
189 189
190int gp106_init_gpu_characteristics(struct gk20a *g)
191{
192 struct nvgpu_gpu_characteristics *gpu = &g->gpu_characteristics;
193
194 int err;
195
196 err = gk20a_init_gpu_characteristics(g);
197 if (err)
198 return err;
199
200 gpu->flags |= NVGPU_GPU_FLAGS_SUPPORT_GET_VOLTAGE |
201 NVGPU_GPU_FLAGS_SUPPORT_GET_CURRENT |
202 NVGPU_GPU_FLAGS_SUPPORT_GET_POWER |
203 NVGPU_GPU_FLAGS_SUPPORT_GET_TEMPERATURE;
204
205 return 0;
206}
207
190int gp106_init_hal(struct gk20a *g) 208int gp106_init_hal(struct gk20a *g)
191{ 209{
192 struct gpu_ops *gops = &g->ops; 210 struct gpu_ops *gops = &g->ops;
@@ -224,7 +242,7 @@ int gp106_init_hal(struct gk20a *g)
224 242
225 gops->name = "gp10x"; 243 gops->name = "gp10x";
226 gops->get_litter_value = gp106_get_litter_value; 244 gops->get_litter_value = gp106_get_litter_value;
227 gops->chip_init_gpu_characteristics = gk20a_init_gpu_characteristics; 245 gops->chip_init_gpu_characteristics = gp106_init_gpu_characteristics;
228 gops->gr_ctx.use_dma_for_fw_bootstrap = true; 246 gops->gr_ctx.use_dma_for_fw_bootstrap = true;
229 gops->read_ptimer = gk20a_read_ptimer; 247 gops->read_ptimer = gk20a_read_ptimer;
230 248
diff --git a/drivers/gpu/nvgpu/gp106/therm_gp106.c b/drivers/gpu/nvgpu/gp106/therm_gp106.c
index a3aa3636..15aff89c 100644
--- a/drivers/gpu/nvgpu/gp106/therm_gp106.c
+++ b/drivers/gpu/nvgpu/gp106/therm_gp106.c
@@ -15,10 +15,8 @@
15#include <linux/debugfs.h> 15#include <linux/debugfs.h>
16#include "hw_therm_gp106.h" 16#include "hw_therm_gp106.h"
17 17
18#ifdef CONFIG_DEBUG_FS 18static int gp106_get_internal_sensor_curr_temp(struct gk20a *g, u32 *temp_f24_8)
19static int therm_get_internal_sensor_curr_temp(void *data, u64 *val)
20{ 19{
21 struct gk20a *g = (struct gk20a *)data;
22 int err = 0; 20 int err = 0;
23 u32 readval; 21 u32 readval;
24 22
@@ -38,7 +36,21 @@ static int therm_get_internal_sensor_curr_temp(void *data, u64 *val)
38 // Convert from F9.5 -> F27.5 -> F24.8. 36 // Convert from F9.5 -> F27.5 -> F24.8.
39 readval &= therm_temp_sensor_tsense_fixed_point_m(); 37 readval &= therm_temp_sensor_tsense_fixed_point_m();
40 38
41 *val = readval; 39 *temp_f24_8 = readval;
40
41 return err;
42}
43
44#ifdef CONFIG_DEBUG_FS
45static int therm_get_internal_sensor_curr_temp(void *data, u64 *val)
46{
47 struct gk20a *g = (struct gk20a *)data;
48 u32 readval;
49 int err;
50
51 err = gp106_get_internal_sensor_curr_temp(g, &readval);
52 if (!err)
53 *val = readval;
42 54
43 return err; 55 return err;
44} 56}
@@ -104,4 +116,5 @@ void gp106_init_therm_ops(struct gpu_ops *gops) {
104 gops->therm.therm_debugfs_init = gp106_therm_debugfs_init; 116 gops->therm.therm_debugfs_init = gp106_therm_debugfs_init;
105#endif 117#endif
106 gops->therm.elcg_init_idle_filters = gp106_elcg_init_idle_filters; 118 gops->therm.elcg_init_idle_filters = gp106_elcg_init_idle_filters;
119 gops->therm.get_internal_sensor_curr_temp = gp106_get_internal_sensor_curr_temp;
107} 120}
diff --git a/drivers/gpu/nvgpu/pmgr/pmgr.c b/drivers/gpu/nvgpu/pmgr/pmgr.c
index f625e37d..e101aba8 100644
--- a/drivers/gpu/nvgpu/pmgr/pmgr.c
+++ b/drivers/gpu/nvgpu/pmgr/pmgr.c
@@ -16,12 +16,10 @@
16#include "pmgrpmu.h" 16#include "pmgrpmu.h"
17#include <linux/debugfs.h> 17#include <linux/debugfs.h>
18 18
19#ifdef CONFIG_DEBUG_FS 19int pmgr_pwr_devices_get_power(struct gk20a *g, u32 *val)
20static int pmgr_pwr_devices_get_current_power(void *data, u64 *val)
21{ 20{
22 struct nv_pmu_pmgr_pwr_devices_query_payload payload; 21 struct nv_pmu_pmgr_pwr_devices_query_payload payload;
23 int status; 22 int status;
24 struct gk20a *g = (struct gk20a *)data;
25 23
26 status = pmgr_pmu_pwr_devices_query_blocking(g, 1, &payload); 24 status = pmgr_pmu_pwr_devices_query_blocking(g, 1, &payload);
27 if (status) 25 if (status)
@@ -34,11 +32,10 @@ static int pmgr_pwr_devices_get_current_power(void *data, u64 *val)
34 return status; 32 return status;
35} 33}
36 34
37static int pmgr_pwr_devices_get_current(void *data, u64 *val) 35int pmgr_pwr_devices_get_current(struct gk20a *g, u32 *val)
38{ 36{
39 struct nv_pmu_pmgr_pwr_devices_query_payload payload; 37 struct nv_pmu_pmgr_pwr_devices_query_payload payload;
40 int status; 38 int status;
41 struct gk20a *g = (struct gk20a *)data;
42 39
43 status = pmgr_pmu_pwr_devices_query_blocking(g, 1, &payload); 40 status = pmgr_pmu_pwr_devices_query_blocking(g, 1, &payload);
44 if (status) 41 if (status)
@@ -51,11 +48,10 @@ static int pmgr_pwr_devices_get_current(void *data, u64 *val)
51 return status; 48 return status;
52} 49}
53 50
54static int pmgr_pwr_devices_get_current_voltage(void *data, u64 *val) 51int pmgr_pwr_devices_get_voltage(struct gk20a *g, u32 *val)
55{ 52{
56 struct nv_pmu_pmgr_pwr_devices_query_payload payload; 53 struct nv_pmu_pmgr_pwr_devices_query_payload payload;
57 int status; 54 int status;
58 struct gk20a *g = (struct gk20a *)data;
59 55
60 status = pmgr_pmu_pwr_devices_query_blocking(g, 1, &payload); 56 status = pmgr_pmu_pwr_devices_query_blocking(g, 1, &payload);
61 if (status) 57 if (status)
@@ -68,14 +64,51 @@ static int pmgr_pwr_devices_get_current_voltage(void *data, u64 *val)
68 return status; 64 return status;
69} 65}
70 66
67#ifdef CONFIG_DEBUG_FS
68int pmgr_pwr_devices_get_power_u64(void *data, u64 *p)
69{
70 struct gk20a *g = (struct gk20a *)data;
71 int err;
72 u32 val;
73
74 err = pmgr_pwr_devices_get_power(g, &val);
75 *p = val;
76
77 return err;
78}
79
80int pmgr_pwr_devices_get_current_u64(void *data, u64 *p)
81{
82 struct gk20a *g = (struct gk20a *)data;
83 int err;
84 u32 val;
85
86 err = pmgr_pwr_devices_get_current(g, &val);
87 *p = val;
88
89 return err;
90}
91
92int pmgr_pwr_devices_get_voltage_u64(void *data, u64 *p)
93{
94 struct gk20a *g = (struct gk20a *)data;
95 int err;
96 u32 val;
97
98 err = pmgr_pwr_devices_get_voltage(g, &val);
99 *p = val;
100
101 return err;
102}
103
71DEFINE_SIMPLE_ATTRIBUTE( 104DEFINE_SIMPLE_ATTRIBUTE(
72 pmgr_power_ctrl_fops, pmgr_pwr_devices_get_current_power, NULL, "%llu\n"); 105 pmgr_power_ctrl_fops, pmgr_pwr_devices_get_power_u64, NULL, "%llu\n");
73 106
74DEFINE_SIMPLE_ATTRIBUTE( 107DEFINE_SIMPLE_ATTRIBUTE(
75 pmgr_current_ctrl_fops, pmgr_pwr_devices_get_current, NULL, "%llu\n"); 108 pmgr_current_ctrl_fops, pmgr_pwr_devices_get_current_u64, NULL, "%llu\n");
76 109
77DEFINE_SIMPLE_ATTRIBUTE( 110DEFINE_SIMPLE_ATTRIBUTE(
78 pmgr_voltage_ctrl_fops, pmgr_pwr_devices_get_current_voltage, NULL, "%llu\n"); 111 pmgr_voltage_ctrl_fops, pmgr_pwr_devices_get_voltage_u64, NULL, "%llu\n");
79 112
80static void pmgr_debugfs_init(struct gk20a *g) { 113static void pmgr_debugfs_init(struct gk20a *g) {
81 struct gk20a_platform *platform = dev_get_drvdata(g->dev); 114 struct gk20a_platform *platform = dev_get_drvdata(g->dev);
diff --git a/drivers/gpu/nvgpu/pmgr/pmgr.h b/drivers/gpu/nvgpu/pmgr/pmgr.h
index 97e7b609..cf511fd1 100644
--- a/drivers/gpu/nvgpu/pmgr/pmgr.h
+++ b/drivers/gpu/nvgpu/pmgr/pmgr.h
@@ -27,5 +27,8 @@ struct pmgr_pmupstate {
27 27
28u32 pmgr_domain_sw_setup(struct gk20a *g); 28u32 pmgr_domain_sw_setup(struct gk20a *g);
29u32 pmgr_domain_pmu_setup(struct gk20a *g); 29u32 pmgr_domain_pmu_setup(struct gk20a *g);
30int pmgr_pwr_devices_get_current(struct gk20a *g, u32 *val);
31int pmgr_pwr_devices_get_voltage(struct gk20a *g, u32 *val);
32int pmgr_pwr_devices_get_power(struct gk20a *g, u32 *val);
30 33
31#endif 34#endif
diff --git a/drivers/gpu/nvgpu/volt/volt_pmu.c b/drivers/gpu/nvgpu/volt/volt_pmu.c
index 4d451b65..a92eb777 100644
--- a/drivers/gpu/nvgpu/volt/volt_pmu.c
+++ b/drivers/gpu/nvgpu/volt/volt_pmu.c
@@ -227,17 +227,7 @@ u32 volt_set_voltage(struct gk20a *g, u32 logic_voltage_uv, u32 sram_voltage_uv)
227 227
228} 228}
229 229
230u32 volt_get_voltage(struct gk20a *g, u32 volt_domain) 230u32 volt_get_voltage(struct gk20a *g, u32 volt_domain, u32 *voltage_uv)
231{ 231{
232 u32 status = 0; 232 return volt_rail_get_voltage(g, volt_domain, voltage_uv);
233 u32 voltage_uv = 0;
234
235 status = volt_rail_get_voltage(g, volt_domain, &voltage_uv);
236 if (status) {
237 gk20a_err(dev_from_gk20a(g),
238 "CTRL_VOLT_DOMAIN_LOGIC get voltage failed");
239 return 0;
240 }
241
242 return voltage_uv;
243} 233}
diff --git a/drivers/gpu/nvgpu/volt/volt_pmu.h b/drivers/gpu/nvgpu/volt/volt_pmu.h
index c98ba321..9af3fb68 100644
--- a/drivers/gpu/nvgpu/volt/volt_pmu.h
+++ b/drivers/gpu/nvgpu/volt/volt_pmu.h
@@ -17,6 +17,6 @@
17u32 volt_pmu_send_load_cmd_to_pmu(struct gk20a *g); 17u32 volt_pmu_send_load_cmd_to_pmu(struct gk20a *g);
18u32 volt_set_voltage(struct gk20a *g, u32 logic_voltage_uv, 18u32 volt_set_voltage(struct gk20a *g, u32 logic_voltage_uv,
19 u32 sram_voltage_uv); 19 u32 sram_voltage_uv);
20u32 volt_get_voltage(struct gk20a *g, u32 volt_domain); 20u32 volt_get_voltage(struct gk20a *g, u32 volt_domain, u32 *voltage_uv);
21 21
22#endif 22#endif