summaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2017-04-25 15:56:38 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2017-05-12 19:09:05 -0400
commit5cbfb69b7ee41507e0ca24c0bc8c7da446784267 (patch)
tree2924fb67383a14e0ce66f81672f9fb2319eb9227 /drivers/gpu
parent3d9b7847d971ba405bf5459fd01bf60ae694300a (diff)
gpu: nvgpu: Abstract condition variable
Add implementation for an abstracted condition variable. Implement it using wait queue in Linux. JIRA NVGPU-14 Change-Id: I211c590cca940ffc31d6c52141689f23f231e7da Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-on: http://git-master/r/1469763 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/nvgpu/Makefile.nvgpu1
-rw-r--r--drivers/gpu/nvgpu/common/linux/cond.c73
-rw-r--r--drivers/gpu/nvgpu/include/nvgpu/cond.h96
-rw-r--r--drivers/gpu/nvgpu/include/nvgpu/linux/cond.h33
4 files changed, 203 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/Makefile.nvgpu b/drivers/gpu/nvgpu/Makefile.nvgpu
index 82c9fec9..04107dbc 100644
--- a/drivers/gpu/nvgpu/Makefile.nvgpu
+++ b/drivers/gpu/nvgpu/Makefile.nvgpu
@@ -32,6 +32,7 @@ nvgpu-y := \
32 common/linux/ioctl_channel.o \ 32 common/linux/ioctl_channel.o \
33 common/linux/ioctl_tsg.o \ 33 common/linux/ioctl_tsg.o \
34 common/linux/log.o \ 34 common/linux/log.o \
35 common/linux/cond.o \
35 common/linux/nvgpu_mem.o \ 36 common/linux/nvgpu_mem.o \
36 common/linux/dma.o \ 37 common/linux/dma.o \
37 common/linux/soc.o \ 38 common/linux/soc.o \
diff --git a/drivers/gpu/nvgpu/common/linux/cond.c b/drivers/gpu/nvgpu/common/linux/cond.c
new file mode 100644
index 00000000..633c34fd
--- /dev/null
+++ b/drivers/gpu/nvgpu/common/linux/cond.c
@@ -0,0 +1,73 @@
1/*
2 * Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms and conditions of the GNU General Public License,
6 * version 2, as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11 * more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include <linux/wait.h>
18#include <linux/sched.h>
19
20#include <nvgpu/cond.h>
21
22int nvgpu_cond_init(struct nvgpu_cond *cond)
23{
24 init_waitqueue_head(&cond->wq);
25 cond->initialized = true;
26
27 return 0;
28}
29
30void nvgpu_cond_destroy(struct nvgpu_cond *cond)
31{
32 cond->initialized = false;
33}
34
35int nvgpu_cond_signal(struct nvgpu_cond *cond)
36{
37 if (!cond->initialized)
38 return -EINVAL;
39
40 wake_up(&cond->wq);
41
42 return 0;
43}
44
45int nvgpu_cond_signal_interruptible(struct nvgpu_cond *cond)
46{
47 if (!cond->initialized)
48 return -EINVAL;
49
50 wake_up_interruptible(&cond->wq);
51
52 return 0;
53}
54
55int nvgpu_cond_broadcast(struct nvgpu_cond *cond)
56{
57 if (!cond->initialized)
58 return -EINVAL;
59
60 wake_up_all(&cond->wq);
61
62 return 0;
63}
64
65int nvgpu_cond_broadcast_interruptible(struct nvgpu_cond *cond)
66{
67 if (!cond->initialized)
68 return -EINVAL;
69
70 wake_up_interruptible_all(&cond->wq);
71
72 return 0;
73}
diff --git a/drivers/gpu/nvgpu/include/nvgpu/cond.h b/drivers/gpu/nvgpu/include/nvgpu/cond.h
new file mode 100644
index 00000000..9cd2c93f
--- /dev/null
+++ b/drivers/gpu/nvgpu/include/nvgpu/cond.h
@@ -0,0 +1,96 @@
1/*
2 * Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms and conditions of the GNU General Public License,
6 * version 2, as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11 * more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#ifndef __NVGPU_COND_H__
18#define __NVGPU_COND_H__
19
20#ifdef __KERNEL__
21#include <nvgpu/linux/cond.h>
22#endif
23
24/*
25 * struct nvgpu_cond
26 *
27 * Should be implemented per-OS in a separate library
28 */
29struct nvgpu_cond;
30
31/**
32 * nvgpu_cond_init - Initialize a condition variable
33 *
34 * @cond - The condition variable to initialize
35 *
36 * Initialize a condition variable before using it.
37 */
38int nvgpu_cond_init(struct nvgpu_cond *cond);
39
40/**
41 * nvgpu_cond_signal - Signal a condition variable
42 *
43 * @cond - The condition variable to signal
44 *
45 * Wake up a waiter for a condition variable to check if its condition has been
46 * satisfied.
47 *
48 * The waiter is using an uninterruptible wait.
49 */
50int nvgpu_cond_signal(struct nvgpu_cond *cond);
51
52/**
53 * nvgpu_cond_signal_interruptible - Signal a condition variable
54 *
55 * @cond - The condition variable to signal
56 *
57 * Wake up a waiter for a condition variable to check if its condition has been
58 * satisfied.
59 *
60 * The waiter is using an interruptible wait.
61 */
62int nvgpu_cond_signal_interruptible(struct nvgpu_cond *cond);
63
64/**
65 * nvgpu_cond_broadcast - Signal all waiters of a condition variable
66 *
67 * @cond - The condition variable to signal
68 *
69 * Wake up all waiters for a condition variable to check if their conditions
70 * have been satisfied.
71 *
72 * The waiters are using an uninterruptible wait.
73 */
74int nvgpu_cond_broadcast(struct nvgpu_cond *cond);
75
76/**
77 * nvgpu_cond_broadcast_interruptible - Signal all waiters of a condition
78 * variable
79 *
80 * @cond - The condition variable to signal
81 *
82 * Wake up all waiters for a condition variable to check if their conditions
83 * have been satisfied.
84 *
85 * The waiters are using an interruptible wait.
86 */
87int nvgpu_cond_broadcast_interruptible(struct nvgpu_cond *cond);
88
89/**
90 * nvgpu_cond_destroy - Destroy a condition variable
91 *
92 * @cond - The condition variable to destroy
93 */
94void nvgpu_cond_destroy(struct nvgpu_cond *cond);
95
96#endif /* __NVGPU_COND_H__ */
diff --git a/drivers/gpu/nvgpu/include/nvgpu/linux/cond.h b/drivers/gpu/nvgpu/include/nvgpu/linux/cond.h
new file mode 100644
index 00000000..3eb52861
--- /dev/null
+++ b/drivers/gpu/nvgpu/include/nvgpu/linux/cond.h
@@ -0,0 +1,33 @@
1/*
2 * Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms and conditions of the GNU General Public License,
6 * version 2, as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11 * more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#ifndef __NVGPU_COND_LINUX_H__
18#define __NVGPU_COND_LINUX_H__
19
20#include <linux/wait.h>
21
22struct nvgpu_cond {
23 bool initialized;
24 wait_queue_head_t wq;
25};
26
27#define NVGPU_COND_WAIT(c, condition, timeout_ms) \
28 wait_event_timeout((c)->wq, condition, timeout_ms)
29
30#define NVGPU_COND_WAIT_INTERRUPTIBLE(c, condition, timeout_ms) \
31 wait_event_interruptible_timeout((c)->wq, condition, timeout_ms)
32
33#endif /* __NVGPU_LOCK_LINUX_H__ */