diff options
-rw-r--r-- | drivers/gpu/nvgpu/vgpu/vgpu.c | 34 | ||||
-rw-r--r-- | include/linux/tegra_vgpu.h | 10 |
2 files changed, 43 insertions, 1 deletions
diff --git a/drivers/gpu/nvgpu/vgpu/vgpu.c b/drivers/gpu/nvgpu/vgpu/vgpu.c index aa4ece5f..0d5dd27b 100644 --- a/drivers/gpu/nvgpu/vgpu/vgpu.c +++ b/drivers/gpu/nvgpu/vgpu/vgpu.c | |||
@@ -23,6 +23,8 @@ | |||
23 | #include "gk20a/hal_gk20a.h" | 23 | #include "gk20a/hal_gk20a.h" |
24 | #include "gk20a/hw_mc_gk20a.h" | 24 | #include "gk20a/hw_mc_gk20a.h" |
25 | #include "gk20a/ctxsw_trace_gk20a.h" | 25 | #include "gk20a/ctxsw_trace_gk20a.h" |
26 | #include "gk20a/tsg_gk20a.h" | ||
27 | #include "gk20a/channel_gk20a.h" | ||
26 | #include "gm20b/hal_gm20b.h" | 28 | #include "gm20b/hal_gm20b.h" |
27 | 29 | ||
28 | #ifdef CONFIG_ARCH_TEGRA_18x_SOC | 30 | #ifdef CONFIG_ARCH_TEGRA_18x_SOC |
@@ -97,6 +99,32 @@ int vgpu_get_attribute(u64 handle, u32 attrib, u32 *value) | |||
97 | return 0; | 99 | return 0; |
98 | } | 100 | } |
99 | 101 | ||
102 | static void vgpu_handle_general_event(struct gk20a *g, | ||
103 | struct tegra_vgpu_general_event_info *info) | ||
104 | { | ||
105 | if (info->id >= g->fifo.num_channels || | ||
106 | info->event_id >= NVGPU_IOCTL_CHANNEL_EVENT_ID_MAX) { | ||
107 | gk20a_err(g->dev, "invalid general event"); | ||
108 | return; | ||
109 | } | ||
110 | |||
111 | if (info->is_tsg) { | ||
112 | struct tsg_gk20a *tsg = &g->fifo.tsg[info->id]; | ||
113 | |||
114 | gk20a_tsg_event_id_post_event(tsg, info->event_id); | ||
115 | } else { | ||
116 | struct channel_gk20a *ch = &g->fifo.channel[info->id]; | ||
117 | |||
118 | if (!gk20a_channel_get(ch)) { | ||
119 | gk20a_err(g->dev, "invalid channel %d for event %d", | ||
120 | (int)info->id, (int)info->event_id); | ||
121 | return; | ||
122 | } | ||
123 | gk20a_channel_event_id_post_event(ch, info->event_id); | ||
124 | gk20a_channel_put(ch); | ||
125 | } | ||
126 | } | ||
127 | |||
100 | static int vgpu_intr_thread(void *dev_id) | 128 | static int vgpu_intr_thread(void *dev_id) |
101 | { | 129 | { |
102 | struct gk20a *g = dev_id; | 130 | struct gk20a *g = dev_id; |
@@ -127,6 +155,12 @@ static int vgpu_intr_thread(void *dev_id) | |||
127 | continue; | 155 | continue; |
128 | } | 156 | } |
129 | 157 | ||
158 | if (msg->event == TEGRA_VGPU_EVENT_CHANNEL) { | ||
159 | vgpu_handle_general_event(g, &msg->info.general_event); | ||
160 | tegra_gr_comm_release(handle); | ||
161 | continue; | ||
162 | } | ||
163 | |||
130 | if (msg->unit == TEGRA_VGPU_INTR_GR) | 164 | if (msg->unit == TEGRA_VGPU_INTR_GR) |
131 | vgpu_gr_isr(g, &msg->info.gr_intr); | 165 | vgpu_gr_isr(g, &msg->info.gr_intr); |
132 | else if (msg->unit == TEGRA_VGPU_NONSTALL_INTR_GR) | 166 | else if (msg->unit == TEGRA_VGPU_NONSTALL_INTR_GR) |
diff --git a/include/linux/tegra_vgpu.h b/include/linux/tegra_vgpu.h index e6e03459..9a31ff40 100644 --- a/include/linux/tegra_vgpu.h +++ b/include/linux/tegra_vgpu.h | |||
@@ -483,6 +483,12 @@ struct tegra_vgpu_fecs_trace_event_info { | |||
483 | u32 type; | 483 | u32 type; |
484 | }; | 484 | }; |
485 | 485 | ||
486 | struct tegra_vgpu_general_event_info { | ||
487 | u32 event_id; | ||
488 | u32 is_tsg; | ||
489 | u32 id; /* channel id or tsg id */ | ||
490 | }; | ||
491 | |||
486 | enum { | 492 | enum { |
487 | 493 | ||
488 | TEGRA_VGPU_INTR_GR = 0, | 494 | TEGRA_VGPU_INTR_GR = 0, |
@@ -496,7 +502,8 @@ enum { | |||
496 | enum { | 502 | enum { |
497 | TEGRA_VGPU_EVENT_INTR = 0, | 503 | TEGRA_VGPU_EVENT_INTR = 0, |
498 | TEGRA_VGPU_EVENT_ABORT, | 504 | TEGRA_VGPU_EVENT_ABORT, |
499 | TEGRA_VGPU_EVENT_FECS_TRACE | 505 | TEGRA_VGPU_EVENT_FECS_TRACE, |
506 | TEGRA_VGPU_EVENT_CHANNEL, | ||
500 | }; | 507 | }; |
501 | 508 | ||
502 | struct tegra_vgpu_intr_msg { | 509 | struct tegra_vgpu_intr_msg { |
@@ -509,6 +516,7 @@ struct tegra_vgpu_intr_msg { | |||
509 | struct tegra_vgpu_fifo_nonstall_intr_info fifo_nonstall_intr; | 516 | struct tegra_vgpu_fifo_nonstall_intr_info fifo_nonstall_intr; |
510 | struct tegra_vgpu_ce2_nonstall_intr_info ce2_nonstall_intr; | 517 | struct tegra_vgpu_ce2_nonstall_intr_info ce2_nonstall_intr; |
511 | struct tegra_vgpu_fecs_trace_event_info fecs_trace; | 518 | struct tegra_vgpu_fecs_trace_event_info fecs_trace; |
519 | struct tegra_vgpu_general_event_info general_event; | ||
512 | char padding[32]; | 520 | char padding[32]; |
513 | } info; | 521 | } info; |
514 | }; | 522 | }; |