diff options
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/channel_gk20a.c | 27 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/channel_gk20a.h | 8 |
2 files changed, 31 insertions, 4 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c index 91e025e1..3f9b0432 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c | |||
@@ -244,6 +244,18 @@ u32 channel_gk20a_pbdma_acquire_val(struct channel_gk20a *c) | |||
244 | return val; | 244 | return val; |
245 | } | 245 | } |
246 | 246 | ||
247 | void gk20a_channel_setup_ramfc_for_privileged_channel(struct channel_gk20a *c) | ||
248 | { | ||
249 | struct gk20a *g = c->g; | ||
250 | struct mem_desc *mem = &c->inst_block; | ||
251 | |||
252 | gk20a_dbg_info("channel %d : set ramfc privileged_channel", c->hw_chid); | ||
253 | |||
254 | /* Enable HCE priv mode for phys mode transfer */ | ||
255 | gk20a_mem_wr32(g, mem, ram_fc_hce_ctrl_w(), | ||
256 | pbdma_hce_ctrl_hce_priv_mode_yes_f()); | ||
257 | } | ||
258 | |||
247 | int channel_gk20a_setup_ramfc(struct channel_gk20a *c, | 259 | int channel_gk20a_setup_ramfc(struct channel_gk20a *c, |
248 | u64 gpfifo_base, u32 gpfifo_entries, u32 flags) | 260 | u64 gpfifo_base, u32 gpfifo_entries, u32 flags) |
249 | { | 261 | { |
@@ -300,6 +312,9 @@ int channel_gk20a_setup_ramfc(struct channel_gk20a *c, | |||
300 | 312 | ||
301 | gk20a_mem_wr32(g, mem, ram_fc_chid_w(), ram_fc_chid_id_f(c->hw_chid)); | 313 | gk20a_mem_wr32(g, mem, ram_fc_chid_w(), ram_fc_chid_id_f(c->hw_chid)); |
302 | 314 | ||
315 | if (c->is_privileged_channel) | ||
316 | gk20a_channel_setup_ramfc_for_privileged_channel(c); | ||
317 | |||
303 | return channel_gk20a_commit_userd(c); | 318 | return channel_gk20a_commit_userd(c); |
304 | } | 319 | } |
305 | 320 | ||
@@ -1093,7 +1108,7 @@ struct channel_gk20a *gk20a_open_new_channel_with_cb(struct gk20a *g, | |||
1093 | void (*update_fn)(struct channel_gk20a *, void *), | 1108 | void (*update_fn)(struct channel_gk20a *, void *), |
1094 | void *update_fn_data) | 1109 | void *update_fn_data) |
1095 | { | 1110 | { |
1096 | struct channel_gk20a *ch = gk20a_open_new_channel(g, -1); | 1111 | struct channel_gk20a *ch = gk20a_open_new_channel(g, -1, false); |
1097 | 1112 | ||
1098 | if (ch) { | 1113 | if (ch) { |
1099 | spin_lock(&ch->update_fn_lock); | 1114 | spin_lock(&ch->update_fn_lock); |
@@ -1105,7 +1120,9 @@ struct channel_gk20a *gk20a_open_new_channel_with_cb(struct gk20a *g, | |||
1105 | return ch; | 1120 | return ch; |
1106 | } | 1121 | } |
1107 | 1122 | ||
1108 | struct channel_gk20a *gk20a_open_new_channel(struct gk20a *g, s32 runlist_id) | 1123 | struct channel_gk20a *gk20a_open_new_channel(struct gk20a *g, |
1124 | s32 runlist_id, | ||
1125 | bool is_privileged_channel) | ||
1109 | { | 1126 | { |
1110 | struct fifo_gk20a *f = &g->fifo; | 1127 | struct fifo_gk20a *f = &g->fifo; |
1111 | struct channel_gk20a *ch; | 1128 | struct channel_gk20a *ch; |
@@ -1132,6 +1149,9 @@ struct channel_gk20a *gk20a_open_new_channel(struct gk20a *g, s32 runlist_id) | |||
1132 | /* Runlist for the channel */ | 1149 | /* Runlist for the channel */ |
1133 | ch->runlist_id = runlist_id; | 1150 | ch->runlist_id = runlist_id; |
1134 | 1151 | ||
1152 | /* Channel privilege level */ | ||
1153 | ch->is_privileged_channel = is_privileged_channel; | ||
1154 | |||
1135 | if (g->ops.fifo.alloc_inst(g, ch)) { | 1155 | if (g->ops.fifo.alloc_inst(g, ch)) { |
1136 | ch->g = NULL; | 1156 | ch->g = NULL; |
1137 | free_channel(f, ch); | 1157 | free_channel(f, ch); |
@@ -1198,7 +1218,8 @@ static int __gk20a_channel_open(struct gk20a *g, struct file *filp, s32 runlist_ | |||
1198 | gk20a_err(dev_from_gk20a(g), "failed to power on, %d", err); | 1218 | gk20a_err(dev_from_gk20a(g), "failed to power on, %d", err); |
1199 | return err; | 1219 | return err; |
1200 | } | 1220 | } |
1201 | ch = gk20a_open_new_channel(g, runlist_id); | 1221 | /* All the user space channel should be non privilege */ |
1222 | ch = gk20a_open_new_channel(g, runlist_id, false); | ||
1202 | gk20a_idle(g->dev); | 1223 | gk20a_idle(g->dev); |
1203 | if (!ch) { | 1224 | if (!ch) { |
1204 | gk20a_err(dev_from_gk20a(g), | 1225 | gk20a_err(dev_from_gk20a(g), |
diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.h b/drivers/gpu/nvgpu/gk20a/channel_gk20a.h index f60bbda4..acd272b4 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.h | |||
@@ -200,6 +200,8 @@ struct channel_gk20a { | |||
200 | u32 interleave_level; | 200 | u32 interleave_level; |
201 | 201 | ||
202 | u32 runlist_id; | 202 | u32 runlist_id; |
203 | |||
204 | bool is_privileged_channel; | ||
203 | }; | 205 | }; |
204 | 206 | ||
205 | static inline bool gk20a_channel_as_bound(struct channel_gk20a *ch) | 207 | static inline bool gk20a_channel_as_bound(struct channel_gk20a *ch) |
@@ -255,7 +257,9 @@ void _gk20a_channel_put(struct channel_gk20a *ch, const char *caller); | |||
255 | int gk20a_wait_channel_idle(struct channel_gk20a *ch); | 257 | int gk20a_wait_channel_idle(struct channel_gk20a *ch); |
256 | 258 | ||
257 | /* runlist_id -1 is synonym for ENGINE_GR_GK20A runlist id */ | 259 | /* runlist_id -1 is synonym for ENGINE_GR_GK20A runlist id */ |
258 | struct channel_gk20a *gk20a_open_new_channel(struct gk20a *g, s32 runlist_id); | 260 | struct channel_gk20a *gk20a_open_new_channel(struct gk20a *g, |
261 | s32 runlist_id, | ||
262 | bool is_privileged_channel); | ||
259 | struct channel_gk20a *gk20a_open_new_channel_with_cb(struct gk20a *g, | 263 | struct channel_gk20a *gk20a_open_new_channel_with_cb(struct gk20a *g, |
260 | void (*update_fn)(struct channel_gk20a *, void *), | 264 | void (*update_fn)(struct channel_gk20a *, void *), |
261 | void *update_fn_data); | 265 | void *update_fn_data); |
@@ -291,4 +295,6 @@ int gk20a_channel_set_timeslice(struct channel_gk20a *ch, u32 timeslice); | |||
291 | void gk20a_channel_event_id_post_event(struct channel_gk20a *ch, | 295 | void gk20a_channel_event_id_post_event(struct channel_gk20a *ch, |
292 | int event_id); | 296 | int event_id); |
293 | 297 | ||
298 | void gk20a_channel_setup_ramfc_for_privileged_channel(struct channel_gk20a *c); | ||
299 | |||
294 | #endif /* CHANNEL_GK20A_H */ | 300 | #endif /* CHANNEL_GK20A_H */ |