summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/channel_gk20a.c
diff options
context:
space:
mode:
authorLakshmanan M <lm@nvidia.com>2016-06-22 06:27:16 -0400
committerTerje Bergstrom <tbergstrom@nvidia.com>2016-06-23 13:31:50 -0400
commit2c04ddcdf6adce0f7430cc42fd09475973d1c62c (patch)
tree813b9220833f3dadc2980895c3b7fb0385488ff2 /drivers/gpu/nvgpu/gk20a/channel_gk20a.c
parentfa4b21f604e9ee69e94b0040c0aadcfbfbfb3d0f (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.c27
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
247void 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
247int channel_gk20a_setup_ramfc(struct channel_gk20a *c, 259int 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
1108struct channel_gk20a *gk20a_open_new_channel(struct gk20a *g, s32 runlist_id) 1123struct 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),