diff --git a/drivers/gpu/nvgpu/vgpu/clk_vgpu.c b/drivers/gpu/nvgpu/vgpu/clk_vgpu.c index fe5533b6d..d728e02be 100644 --- a/drivers/gpu/nvgpu/vgpu/clk_vgpu.c +++ b/drivers/gpu/nvgpu/vgpu/clk_vgpu.c @@ -128,3 +128,26 @@ int vgpu_clk_get_freqs(struct device *dev, return 0; } + +int vgpu_clk_cap_rate(struct device *dev, unsigned long rate) +{ + struct gk20a_platform *platform = gk20a_get_platform(dev); + struct gk20a *g = platform->g; + struct tegra_vgpu_cmd_msg msg = {}; + struct tegra_vgpu_gpu_clk_rate_params *p = &msg.params.gpu_clk_rate; + int err = 0; + + gk20a_dbg_fn(""); + + msg.cmd = TEGRA_VGPU_CMD_CAP_GPU_CLK_RATE; + msg.handle = vgpu_get_handle(g); + p->rate = (u32)rate; + err = vgpu_comm_sendrecv(&msg, sizeof(msg), sizeof(msg)); + err = err ? err : msg.ret; + if (err) { + nvgpu_err(g, "%s failed - %d", __func__, err); + return err; + } + + return 0; +} diff --git a/drivers/gpu/nvgpu/vgpu/clk_vgpu.h b/drivers/gpu/nvgpu/vgpu/clk_vgpu.h index a90b63d8d..4dccf04fe 100644 --- a/drivers/gpu/nvgpu/vgpu/clk_vgpu.h +++ b/drivers/gpu/nvgpu/vgpu/clk_vgpu.h @@ -20,4 +20,5 @@ void vgpu_init_clk_support(struct gk20a *g); long vgpu_clk_round_rate(struct device *dev, unsigned long rate); int vgpu_clk_get_freqs(struct device *dev, unsigned long **freqs, int *num_freqs); +int vgpu_clk_cap_rate(struct device *dev, unsigned long rate); #endif diff --git a/drivers/gpu/nvgpu/vgpu/vgpu.c b/drivers/gpu/nvgpu/vgpu/vgpu.c index e8a778f54..52f375f9f 100644 --- a/drivers/gpu/nvgpu/vgpu/vgpu.c +++ b/drivers/gpu/nvgpu/vgpu/vgpu.c @@ -516,20 +516,13 @@ static int vgpu_qos_notify(struct notifier_block *nb, container_of(nb, struct gk20a_scale_profile, qos_notify_block); struct gk20a *g = get_gk20a(profile->dev); - struct tegra_vgpu_cmd_msg msg = {}; - struct tegra_vgpu_gpu_clk_rate_params *p = &msg.params.gpu_clk_rate; u32 max_freq; int err; gk20a_dbg_fn(""); max_freq = (u32)pm_qos_read_max_bound(PM_QOS_GPU_FREQ_BOUNDS); - - msg.cmd = TEGRA_VGPU_CMD_SET_GPU_CLK_RATE; - msg.handle = vgpu_get_handle_from_dev(profile->dev); - p->rate = max_freq; - err = vgpu_comm_sendrecv(&msg, sizeof(msg), sizeof(msg)); - err = err ? err : msg.ret; + err = vgpu_clk_cap_rate(profile->dev, max_freq); if (err) nvgpu_err(g, "%s failed, err=%d", __func__, err); diff --git a/include/linux/tegra_vgpu.h b/include/linux/tegra_vgpu.h index 4d1e1ac91..f0a809ba6 100644 --- a/include/linux/tegra_vgpu.h +++ b/include/linux/tegra_vgpu.h @@ -102,6 +102,7 @@ enum { TEGRA_VGPU_CMD_CLEAR_SM_ERROR_STATE = 68, TEGRA_VGPU_CMD_GET_GPU_CLK_RATE = 69, TEGRA_VGPU_CMD_GET_GPU_FREQ_TABLE = 70, + TEGRA_VGPU_CMD_CAP_GPU_CLK_RATE = 71, TEGRA_VGPU_CMD_PROF_MGT = 72, TEGRA_VGPU_CMD_GET_TIMESTAMPS_ZIPPER = 74, };