diff options
Diffstat (limited to 'drivers/gpu/nvgpu/os')
-rw-r--r-- | drivers/gpu/nvgpu/os/linux/driver_common.c | 3 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c | 21 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/os/linux/os_linux.h | 4 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/os/linux/vgpu/vgpu_linux.c | 3 |
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 | ||
62 | static inline struct gk20a_ctrl_priv * | ||
63 | gk20a_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 | |||
60 | static u32 gk20a_as_translate_as_alloc_flags(struct gk20a *g, u32 flags) | 69 | static 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); |
107 | free_ref: | 116 | free_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 | } |
115 | int gk20a_ctrl_dev_release(struct inode *inode, struct file *filp) | 129 | int 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 | ||