summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/channel_gk20a.h
diff options
context:
space:
mode:
authorDeepak Nibade <dnibade@nvidia.com>2016-03-31 03:03:19 -0400
committerTerje Bergstrom <tbergstrom@nvidia.com>2016-04-07 11:43:49 -0400
commite87ba53235151cccee181489ceb5e35b131e7d2d (patch)
tree478b71365cebaab36879c1020c6582842c8d5760 /drivers/gpu/nvgpu/gk20a/channel_gk20a.h
parent76ab6c1e5b351b069cde3ae8137e3fbdf4994d16 (diff)
gpu: nvgpu: add channel event id support
With NVGPU_IOCTL_CHANNEL_EVENTS_CTRL, nvgpu can raise events to User space. But user space cannot distinguish between various types of events. To overcome this, we need finer-grained API to deliver various events to user space. Remove old API NVGPU_IOCTL_CHANNEL_EVENTS_CTRL, and all the support for this API (we can remove this since User space has not started using this API at all) Add new API NVGPU_IOCTL_CHANNEL_EVENT_ID_CTRL which will accept an event_id (like BPT.INT or BPT.PAUSE), a command to enable the event, and return a file descriptor on which we can raise the event (if cmd=enable) Event is disabled when file descriptor is closed Add file operations "gk20a_event_id_ops" to support polling on event fd Also add API gk20a_channel_get_event_data_from_id() to get event_data of event from its id Bug 200089620 Change-Id: I5288f19f38ff49448c46338c33b2a927c9e02254 Signed-off-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-on: http://git-master/r/1030775 (cherry picked from commit 5721ce2735950440bedc2b86f851db08ed593275) Reviewed-on: http://git-master/r/1120318 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/channel_gk20a.h')
-rw-r--r--drivers/gpu/nvgpu/gk20a/channel_gk20a.h21
1 files changed, 12 insertions, 9 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.h b/drivers/gpu/nvgpu/gk20a/channel_gk20a.h
index e3fbba3e..cbe0fd59 100644
--- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.h
@@ -74,10 +74,16 @@ struct channel_gk20a_timeout {
74 struct channel_gk20a_job *job; 74 struct channel_gk20a_job *job;
75}; 75};
76 76
77struct channel_gk20a_poll_events { 77struct gk20a_event_id_data {
78 struct gk20a *g;
79
80 int id; /* ch or tsg */
81 bool is_tsg;
82 u32 event_id;
83
84 wait_queue_head_t event_id_wq;
78 struct mutex lock; 85 struct mutex lock;
79 bool events_enabled; 86 struct list_head event_id_node;
80 int num_pending_events;
81}; 87};
82 88
83struct channel_gk20a_clean_up { 89struct channel_gk20a_clean_up {
@@ -163,6 +169,9 @@ struct channel_gk20a {
163 struct mutex dbg_s_lock; 169 struct mutex dbg_s_lock;
164 struct list_head dbg_s_list; 170 struct list_head dbg_s_list;
165 171
172 struct list_head event_id_list;
173 struct mutex event_id_list_lock;
174
166 bool has_timedout; 175 bool has_timedout;
167 u32 timeout_ms_max; 176 u32 timeout_ms_max;
168 bool timeout_debug_dump; 177 bool timeout_debug_dump;
@@ -178,9 +187,6 @@ struct channel_gk20a {
178 u64 virt_ctx; 187 u64 virt_ctx;
179#endif 188#endif
180 189
181 /* event support */
182 struct channel_gk20a_poll_events poll_events;
183
184 /* signal channel owner via a callback, if set, in gk20a_channel_update 190 /* signal channel owner via a callback, if set, in gk20a_channel_update
185 * via schedule_work */ 191 * via schedule_work */
186 void (*update_fn)(struct channel_gk20a *, void *); 192 void (*update_fn)(struct channel_gk20a *, void *);
@@ -227,9 +233,6 @@ long gk20a_channel_ioctl(struct file *filp,
227int gk20a_channel_release(struct inode *inode, struct file *filp); 233int gk20a_channel_release(struct inode *inode, struct file *filp);
228struct channel_gk20a *gk20a_get_channel_from_file(int fd); 234struct channel_gk20a *gk20a_get_channel_from_file(int fd);
229void gk20a_channel_update(struct channel_gk20a *c, int nr_completed); 235void gk20a_channel_update(struct channel_gk20a *c, int nr_completed);
230unsigned int gk20a_channel_poll(struct file *filep, poll_table *wait);
231void gk20a_channel_event(struct channel_gk20a *ch);
232void gk20a_channel_post_event(struct channel_gk20a *ch);
233 236
234void gk20a_init_channel(struct gpu_ops *gops); 237void gk20a_init_channel(struct gpu_ops *gops);
235 238