summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKonsta Holtta <kholtta@nvidia.com>2018-09-11 07:37:09 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2019-08-15 03:58:25 -0400
commit7e96b143909b8ab7ba18f28b51cb796d8544aabb (patch)
treed78004bc186aaa8528a56c009bce4526c2a2869f
parent8281262187c50be841a83a5b99e2485836922269 (diff)
gpu: nvgpu: track opened Linux ctrl files
An upcoming patch will need to enumerate opened ctrl nodes; track them in a list, protected by a mutex. Bug 200145225 Bug 200541476 Change-Id: I50dc15056832a3bb53fbdd7bd2bffcdaecc7b21c Signed-off-by: Konsta Holtta <kholtta@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1811840 Reviewed-by: Alex Waterman <alexw@nvidia.com> Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-by: Vijayakumar Subbu <vsubbu@nvidia.com> Signed-off-by: Debarshi Dutta <ddutta@nvidia.com> (cherry picked from commit d53495400e15fdef80be2f04a9f2312b81d2bd6d in dev-main) Reviewed-on: https://git-master.nvidia.com/r/2170005 GVS: Gerrit_Virtual_Submit Reviewed-by: Bibek Basu <bbasu@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
-rw-r--r--drivers/gpu/nvgpu/os/linux/driver_common.c3
-rw-r--r--drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c21
-rw-r--r--drivers/gpu/nvgpu/os/linux/os_linux.h4
-rw-r--r--drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c3
4 files changed, 30 insertions, 1 deletions
diff --git a/drivers/gpu/nvgpu/os/linux/driver_common.c b/drivers/gpu/nvgpu/os/linux/driver_common.c
index ea4dadac..c76dabeb 100644
--- a/drivers/gpu/nvgpu/os/linux/driver_common.c
+++ b/drivers/gpu/nvgpu/os/linux/driver_common.c
@@ -70,6 +70,9 @@ static void nvgpu_init_vars(struct gk20a *g)
70 /* Init the clock req count to 0 */ 70 /* Init the clock req count to 0 */
71 nvgpu_atomic_set(&g->clk_arb_global_nr, 0); 71 nvgpu_atomic_set(&g->clk_arb_global_nr, 0);
72 72
73 nvgpu_mutex_init(&l->ctrl.privs_lock);
74 nvgpu_init_list_node(&l->ctrl.privs);
75
73 l->regs_saved = l->regs; 76 l->regs_saved = l->regs;
74 l->bar1_saved = l->bar1; 77 l->bar1_saved = l->bar1;
75 78
diff --git a/drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c b/drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c
index 3ccc6b0a..e85cec9c 100644
--- a/drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c
+++ b/drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c
@@ -55,8 +55,17 @@ struct gk20a_ctrl_priv {
55 struct device *dev; 55 struct device *dev;
56 struct gk20a *g; 56 struct gk20a *g;
57 struct nvgpu_clk_session *clk_session; 57 struct nvgpu_clk_session *clk_session;
58
59 struct nvgpu_list_node list;
58}; 60};
59 61
62static inline struct gk20a_ctrl_priv *
63gk20a_ctrl_priv_from_list(struct nvgpu_list_node *node)
64{
65 return (struct gk20a_ctrl_priv *)
66 ((uintptr_t)node - offsetof(struct gk20a_ctrl_priv, list));
67}
68
60static u32 gk20a_as_translate_as_alloc_flags(struct gk20a *g, u32 flags) 69static u32 gk20a_as_translate_as_alloc_flags(struct gk20a *g, u32 flags)
61{ 70{
62 u32 core_flags = 0; 71 u32 core_flags = 0;
@@ -105,20 +114,30 @@ int gk20a_ctrl_dev_open(struct inode *inode, struct file *filp)
105 114
106 err = nvgpu_clk_arb_init_session(g, &priv->clk_session); 115 err = nvgpu_clk_arb_init_session(g, &priv->clk_session);
107free_ref: 116free_ref:
108 if (err) { 117 if (err != 0) {
109 gk20a_put(g); 118 gk20a_put(g);
110 if (priv) 119 if (priv)
111 nvgpu_kfree(g, priv); 120 nvgpu_kfree(g, priv);
121 } else {
122 nvgpu_mutex_acquire(&l->ctrl.privs_lock);
123 nvgpu_list_add(&priv->list, &l->ctrl.privs);
124 nvgpu_mutex_release(&l->ctrl.privs_lock);
112 } 125 }
126
113 return err; 127 return err;
114} 128}
115int gk20a_ctrl_dev_release(struct inode *inode, struct file *filp) 129int gk20a_ctrl_dev_release(struct inode *inode, struct file *filp)
116{ 130{
117 struct gk20a_ctrl_priv *priv = filp->private_data; 131 struct gk20a_ctrl_priv *priv = filp->private_data;
118 struct gk20a *g = priv->g; 132 struct gk20a *g = priv->g;
133 struct nvgpu_os_linux *l = nvgpu_os_linux_from_gk20a(g);
119 134
120 nvgpu_log_fn(g, " "); 135 nvgpu_log_fn(g, " ");
121 136
137 nvgpu_mutex_acquire(&l->ctrl.privs_lock);
138 nvgpu_list_del(&priv->list);
139 nvgpu_mutex_release(&l->ctrl.privs_lock);
140
122 if (priv->clk_session) 141 if (priv->clk_session)
123 nvgpu_clk_arb_release_session(g, priv->clk_session); 142 nvgpu_clk_arb_release_session(g, priv->clk_session);
124 143
diff --git a/drivers/gpu/nvgpu/os/linux/os_linux.h b/drivers/gpu/nvgpu/os/linux/os_linux.h
index d4b5a770..5880384a 100644
--- a/drivers/gpu/nvgpu/os/linux/os_linux.h
+++ b/drivers/gpu/nvgpu/os/linux/os_linux.h
@@ -65,6 +65,10 @@ struct nvgpu_os_linux {
65 struct { 65 struct {
66 struct cdev cdev; 66 struct cdev cdev;
67 struct device *node; 67 struct device *node;
68 /* see gk20a_ctrl_priv */
69 struct nvgpu_list_node privs;
70 /* guards modifications to the list and its contents */
71 struct nvgpu_mutex privs_lock;
68 } ctrl; 72 } ctrl;
69 73
70 struct { 74 struct {
diff --git a/drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c b/drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c
index 522f1b86..80bcfffb 100644
--- a/drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c
+++ b/drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c
@@ -73,6 +73,9 @@ static void vgpu_init_vars(struct gk20a *g, struct gk20a_platform *platform)
73 73
74 nvgpu_mutex_init(&priv->vgpu_clk_get_freq_lock); 74 nvgpu_mutex_init(&priv->vgpu_clk_get_freq_lock);
75 75
76 nvgpu_mutex_init(&l->ctrl.privs_lock);
77 nvgpu_init_list_node(&l->ctrl.privs);
78
76 l->regs_saved = l->regs; 79 l->regs_saved = l->regs;
77 l->bar1_saved = l->bar1; 80 l->bar1_saved = l->bar1;
78 81