diff options
Diffstat (limited to 'drivers/gpu/nvgpu/vgpu')
-rw-r--r-- | drivers/gpu/nvgpu/vgpu/vgpu.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/vgpu/vgpu.c b/drivers/gpu/nvgpu/vgpu/vgpu.c index 0d5dd27b..399b7c67 100644 --- a/drivers/gpu/nvgpu/vgpu/vgpu.c +++ b/drivers/gpu/nvgpu/vgpu/vgpu.c | |||
@@ -312,6 +312,29 @@ static int vgpu_init_gpu_characteristics(struct gk20a *g) | |||
312 | return 0; | 312 | return 0; |
313 | } | 313 | } |
314 | 314 | ||
315 | static int vgpu_read_ptimer(struct gk20a *g, u64 *value) | ||
316 | { | ||
317 | struct gk20a_platform *platform = gk20a_get_platform(g->dev); | ||
318 | struct tegra_vgpu_cmd_msg msg = {0}; | ||
319 | struct tegra_vgpu_read_ptimer_params *p = &msg.params.read_ptimer; | ||
320 | int err; | ||
321 | |||
322 | gk20a_dbg_fn(""); | ||
323 | |||
324 | msg.cmd = TEGRA_VGPU_CMD_READ_PTIMER; | ||
325 | msg.handle = platform->virt_handle; | ||
326 | |||
327 | err = vgpu_comm_sendrecv(&msg, sizeof(msg), sizeof(msg)); | ||
328 | err = err ? err : msg.ret; | ||
329 | if (!err) | ||
330 | *value = p->time; | ||
331 | else | ||
332 | gk20a_err(dev_from_gk20a(g), | ||
333 | "vgpu read ptimer failed, err=%d", err); | ||
334 | |||
335 | return err; | ||
336 | } | ||
337 | |||
315 | void vgpu_init_hal_common(struct gk20a *g) | 338 | void vgpu_init_hal_common(struct gk20a *g) |
316 | { | 339 | { |
317 | struct gpu_ops *gops = &g->ops; | 340 | struct gpu_ops *gops = &g->ops; |
@@ -324,6 +347,7 @@ void vgpu_init_hal_common(struct gk20a *g) | |||
324 | vgpu_init_fecs_trace_ops(gops); | 347 | vgpu_init_fecs_trace_ops(gops); |
325 | vgpu_init_tsg_ops(gops); | 348 | vgpu_init_tsg_ops(gops); |
326 | gops->chip_init_gpu_characteristics = vgpu_init_gpu_characteristics; | 349 | gops->chip_init_gpu_characteristics = vgpu_init_gpu_characteristics; |
350 | gops->read_ptimer = vgpu_read_ptimer; | ||
327 | } | 351 | } |
328 | 352 | ||
329 | static int vgpu_init_hal(struct gk20a *g) | 353 | static int vgpu_init_hal(struct gk20a *g) |