diff options
author | Deepak Nibade <dnibade@nvidia.com> | 2016-03-31 03:03:19 -0400 |
---|---|---|
committer | Terje Bergstrom <tbergstrom@nvidia.com> | 2016-04-07 11:43:49 -0400 |
commit | e87ba53235151cccee181489ceb5e35b131e7d2d (patch) | |
tree | 478b71365cebaab36879c1020c6582842c8d5760 /drivers/gpu/nvgpu/gk20a/channel_gk20a.h | |
parent | 76ab6c1e5b351b069cde3ae8137e3fbdf4994d16 (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.h | 21 |
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 | ||
77 | struct channel_gk20a_poll_events { | 77 | struct 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 | ||
83 | struct channel_gk20a_clean_up { | 89 | struct 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, | |||
227 | int gk20a_channel_release(struct inode *inode, struct file *filp); | 233 | int gk20a_channel_release(struct inode *inode, struct file *filp); |
228 | struct channel_gk20a *gk20a_get_channel_from_file(int fd); | 234 | struct channel_gk20a *gk20a_get_channel_from_file(int fd); |
229 | void gk20a_channel_update(struct channel_gk20a *c, int nr_completed); | 235 | void gk20a_channel_update(struct channel_gk20a *c, int nr_completed); |
230 | unsigned int gk20a_channel_poll(struct file *filep, poll_table *wait); | ||
231 | void gk20a_channel_event(struct channel_gk20a *ch); | ||
232 | void gk20a_channel_post_event(struct channel_gk20a *ch); | ||
233 | 236 | ||
234 | void gk20a_init_channel(struct gpu_ops *gops); | 237 | void gk20a_init_channel(struct gpu_ops *gops); |
235 | 238 | ||