diff options
-rw-r--r-- | drivers/gpu/nvgpu/gp106/hal_gp106.c | 20 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gp106/therm_gp106.c | 21 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/pmgr/pmgr.c | 53 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/pmgr/pmgr.h | 3 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/volt/volt_pmu.c | 14 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/volt/volt_pmu.h | 2 |
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 | ||
190 | int 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 | |||
190 | int gp106_init_hal(struct gk20a *g) | 208 | int 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 | 18 | static int gp106_get_internal_sensor_curr_temp(struct gk20a *g, u32 *temp_f24_8) |
19 | static 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 | ||
45 | static 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 | 19 | int pmgr_pwr_devices_get_power(struct gk20a *g, u32 *val) |
20 | static 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 | ||
37 | static int pmgr_pwr_devices_get_current(void *data, u64 *val) | 35 | int 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 | ||
54 | static int pmgr_pwr_devices_get_current_voltage(void *data, u64 *val) | 51 | int 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 | ||
68 | int 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 | |||
80 | int 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 | |||
92 | int 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 | |||
71 | DEFINE_SIMPLE_ATTRIBUTE( | 104 | DEFINE_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 | ||
74 | DEFINE_SIMPLE_ATTRIBUTE( | 107 | DEFINE_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 | ||
77 | DEFINE_SIMPLE_ATTRIBUTE( | 110 | DEFINE_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 | ||
80 | static void pmgr_debugfs_init(struct gk20a *g) { | 113 | static 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 | ||
28 | u32 pmgr_domain_sw_setup(struct gk20a *g); | 28 | u32 pmgr_domain_sw_setup(struct gk20a *g); |
29 | u32 pmgr_domain_pmu_setup(struct gk20a *g); | 29 | u32 pmgr_domain_pmu_setup(struct gk20a *g); |
30 | int pmgr_pwr_devices_get_current(struct gk20a *g, u32 *val); | ||
31 | int pmgr_pwr_devices_get_voltage(struct gk20a *g, u32 *val); | ||
32 | int 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 | ||
230 | u32 volt_get_voltage(struct gk20a *g, u32 volt_domain) | 230 | u32 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 @@ | |||
17 | u32 volt_pmu_send_load_cmd_to_pmu(struct gk20a *g); | 17 | u32 volt_pmu_send_load_cmd_to_pmu(struct gk20a *g); |
18 | u32 volt_set_voltage(struct gk20a *g, u32 logic_voltage_uv, | 18 | u32 volt_set_voltage(struct gk20a *g, u32 logic_voltage_uv, |
19 | u32 sram_voltage_uv); | 19 | u32 sram_voltage_uv); |
20 | u32 volt_get_voltage(struct gk20a *g, u32 volt_domain); | 20 | u32 volt_get_voltage(struct gk20a *g, u32 volt_domain, u32 *voltage_uv); |
21 | 21 | ||
22 | #endif | 22 | #endif |