diff options
author | Debarshi Dutta <ddutta@nvidia.com> | 2018-09-04 01:25:33 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2018-09-20 13:50:12 -0400 |
commit | 519948a9c664020fd0b37118749faad2dfd73d97 (patch) | |
tree | 1eb57dc393075670331ca89cf366a093d75d3f47 /drivers/gpu/nvgpu/os | |
parent | 1c7258411da89aea5279e9a8d117479928f8bf64 (diff) |
gpu: nvgpu: add igpu support for clk_arbiter.
This patch constructs clk_arbiter specific code for gp10b as well as
gv11b and does the necessary plumbing in the clk_arbiter code. The
changes made are as follows.
1) Constructed clk_arb_gp10b.* files which add support for clk_arb
related HALS including the nvgpu_clk_arb_init and nvgpu_clk_arb_cb.
This doesn't have support for debugfs nor the VFUpdateEvent yet and
consequently no support for arb->notifications.
2) Added gpcclk specific variables corresponding to every gpc2clk in
a given clk_arb related struct.
3) Linux specific support_clk_freq_controller is assigned true in
platform_gp10b.c and platform_gv11b.c files.
4) Incremented the clk_arb_worker.put atomic variable during
worker_deinit so as to allow the worker thread to be stopped.
5) Added the flag clk_arb_events_supported as part of struct
nvgpu_clk_arb. This flag is used to selectively account for the extra
refcounting present in OS specific code i.e.
nvgpu_clk_arb_commit_request_fd. For igpus, the extra refcount is
reduced during nvgpu_clk_arb_release_completion_dev.
Bug 2061372
Change-Id: Id00acb106db2b46e55aa0324034a16a73723c078
Signed-off-by: Debarshi Dutta <ddutta@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/1774281
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/os')
-rw-r--r-- | drivers/gpu/nvgpu/os/linux/ioctl_clk_arb.c | 11 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/os/linux/platform_gp10b_tegra.c | 2 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/os/linux/platform_gv11b_tegra.c | 2 |
3 files changed, 15 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/os/linux/ioctl_clk_arb.c b/drivers/gpu/nvgpu/os/linux/ioctl_clk_arb.c index 501b5f93..2d9946b1 100644 --- a/drivers/gpu/nvgpu/os/linux/ioctl_clk_arb.c +++ b/drivers/gpu/nvgpu/os/linux/ioctl_clk_arb.c | |||
@@ -55,6 +55,13 @@ static int nvgpu_clk_arb_release_completion_dev(struct inode *inode, | |||
55 | 55 | ||
56 | clk_arb_dbg(session->g, " "); | 56 | clk_arb_dbg(session->g, " "); |
57 | 57 | ||
58 | /* This is done to account for the extra refcount taken in | ||
59 | * nvgpu_clk_arb_commit_request_fd without events support in iGPU | ||
60 | */ | ||
61 | if (!session->g->clk_arb->clk_arb_events_supported) { | ||
62 | nvgpu_ref_put(&dev->refcount, nvgpu_clk_arb_free_fd); | ||
63 | } | ||
64 | |||
58 | nvgpu_ref_put(&session->refcount, nvgpu_clk_arb_free_session); | 65 | nvgpu_ref_put(&session->refcount, nvgpu_clk_arb_free_session); |
59 | nvgpu_ref_put(&dev->refcount, nvgpu_clk_arb_free_fd); | 66 | nvgpu_ref_put(&dev->refcount, nvgpu_clk_arb_free_fd); |
60 | return 0; | 67 | return 0; |
@@ -425,6 +432,10 @@ int nvgpu_clk_arb_commit_request_fd(struct gk20a *g, | |||
425 | err = -EINVAL; | 432 | err = -EINVAL; |
426 | goto fdput_fd; | 433 | goto fdput_fd; |
427 | } | 434 | } |
435 | |||
436 | clk_arb_dbg(g, "requested target = %u\n", | ||
437 | (u32)dev->gpc2clk_target_mhz); | ||
438 | |||
428 | nvgpu_ref_get(&dev->refcount); | 439 | nvgpu_ref_get(&dev->refcount); |
429 | nvgpu_spinlock_acquire(&session->session_lock); | 440 | nvgpu_spinlock_acquire(&session->session_lock); |
430 | nvgpu_list_add(&dev->node, &session->targets); | 441 | nvgpu_list_add(&dev->node, &session->targets); |
diff --git a/drivers/gpu/nvgpu/os/linux/platform_gp10b_tegra.c b/drivers/gpu/nvgpu/os/linux/platform_gp10b_tegra.c index 5fdcb05c..a792bfcb 100644 --- a/drivers/gpu/nvgpu/os/linux/platform_gp10b_tegra.c +++ b/drivers/gpu/nvgpu/os/linux/platform_gp10b_tegra.c | |||
@@ -171,6 +171,8 @@ static int gp10b_tegra_probe(struct device *dev) | |||
171 | 171 | ||
172 | nvgpu_mutex_init(&platform->clk_get_freq_lock); | 172 | nvgpu_mutex_init(&platform->clk_get_freq_lock); |
173 | 173 | ||
174 | platform->g->ops.clk.support_clk_freq_controller = true; | ||
175 | |||
174 | return 0; | 176 | return 0; |
175 | } | 177 | } |
176 | 178 | ||
diff --git a/drivers/gpu/nvgpu/os/linux/platform_gv11b_tegra.c b/drivers/gpu/nvgpu/os/linux/platform_gv11b_tegra.c index b055eb6e..ec93b4c3 100644 --- a/drivers/gpu/nvgpu/os/linux/platform_gv11b_tegra.c +++ b/drivers/gpu/nvgpu/os/linux/platform_gv11b_tegra.c | |||
@@ -99,6 +99,8 @@ static int gv11b_tegra_probe(struct device *dev) | |||
99 | 99 | ||
100 | nvgpu_mutex_init(&platform->clk_get_freq_lock); | 100 | nvgpu_mutex_init(&platform->clk_get_freq_lock); |
101 | 101 | ||
102 | platform->g->ops.clk.support_clk_freq_controller = true; | ||
103 | |||
102 | return 0; | 104 | return 0; |
103 | } | 105 | } |
104 | 106 | ||