diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c index 35e4f0b85..a3448b2c7 100644 --- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c @@ -5436,6 +5436,16 @@ static int gk20a_gr_handle_semaphore_pending(struct gk20a *g, struct fifo_gk20a *f = &g->fifo; struct channel_gk20a *ch = &f->channel[isr_data->chid]; + if (gk20a_is_channel_marked_as_tsg(ch)) { + struct tsg_gk20a *tsg = &g->fifo.tsg[ch->tsgid]; + + gk20a_tsg_event_id_post_event(tsg, + NVGPU_IOCTL_CHANNEL_EVENT_ID_GR_SEMAPHORE_WRITE_AWAKEN); + } else { + gk20a_channel_event_id_post_event(ch, + NVGPU_IOCTL_CHANNEL_EVENT_ID_GR_SEMAPHORE_WRITE_AWAKEN); + } + wake_up_interruptible_all(&ch->semaphore_wq); return 0; diff --git a/include/uapi/linux/nvgpu.h b/include/uapi/linux/nvgpu.h index fe4e6de9a..e65c8d74a 100644 --- a/include/uapi/linux/nvgpu.h +++ b/include/uapi/linux/nvgpu.h @@ -1138,7 +1138,8 @@ struct nvgpu_event_id_ctrl_args { #define NVGPU_IOCTL_CHANNEL_EVENT_ID_BPT_INT 0 #define NVGPU_IOCTL_CHANNEL_EVENT_ID_BPT_PAUSE 1 #define NVGPU_IOCTL_CHANNEL_EVENT_ID_BLOCKING_SYNC 2 -#define NVGPU_IOCTL_CHANNEL_EVENT_ID_MAX 5 +#define NVGPU_IOCTL_CHANNEL_EVENT_ID_GR_SEMAPHORE_WRITE_AWAKEN 5 +#define NVGPU_IOCTL_CHANNEL_EVENT_ID_MAX 6 #define NVGPU_IOCTL_CHANNEL_EVENT_ID_CMD_ENABLE 1