diff options
author | Lakshmanan M <lm@nvidia.com> | 2016-06-22 06:27:16 -0400 |
---|---|---|
committer | Terje Bergstrom <tbergstrom@nvidia.com> | 2016-06-23 13:31:50 -0400 |
commit | 2c04ddcdf6adce0f7430cc42fd09475973d1c62c (patch) | |
tree | 813b9220833f3dadc2980895c3b7fb0385488ff2 /drivers/gpu/nvgpu/gk20a/channel_gk20a.c | |
parent | fa4b21f604e9ee69e94b0040c0aadcfbfbfb3d0f (diff) |
gpu: nvgpu: Add interface for privileged channel allocation
Added interface for privileged channel allocation to excute
the privileged method (ex. CE phys mode transfer).
JIRA DNVGPU-53
Change-Id: I07f9181720b14345cf5890919c2818dfcf505d86
Signed-off-by: Lakshmanan M <lm@nvidia.com>
Reviewed-on: http://git-master/r/1169315
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Tested-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/channel_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/channel_gk20a.c | 27 |
1 files changed, 24 insertions, 3 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), |