Commit | Line | Data |
---|---|---|
7ede0b0b TB |
1 | /* |
2 | * Tegra host1x Interrupt Management | |
3 | * | |
4 | * Copyright (c) 2010-2013, NVIDIA Corporation. | |
5 | * | |
6 | * This program is free software; you can redistribute it and/or modify it | |
7 | * under the terms and conditions of the GNU General Public License, | |
8 | * version 2, as published by the Free Software Foundation. | |
9 | * | |
10 | * This program is distributed in the hope it will be useful, but WITHOUT | |
11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | |
13 | * more details. | |
14 | * | |
15 | * You should have received a copy of the GNU General Public License | |
16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
17 | */ | |
18 | ||
19 | #ifndef __HOST1X_INTR_H | |
20 | #define __HOST1X_INTR_H | |
21 | ||
22 | #include <linux/interrupt.h> | |
23 | #include <linux/workqueue.h> | |
24 | ||
25 | struct host1x; | |
26 | ||
27 | enum host1x_intr_action { | |
6579324a TB |
28 | /* |
29 | * Perform cleanup after a submit has completed. | |
30 | * 'data' points to a channel | |
31 | */ | |
32 | HOST1X_INTR_ACTION_SUBMIT_COMPLETE = 0, | |
33 | ||
7ede0b0b TB |
34 | /* |
35 | * Wake up a task. | |
36 | * 'data' points to a wait_queue_head_t | |
37 | */ | |
38 | HOST1X_INTR_ACTION_WAKEUP, | |
39 | ||
40 | /* | |
41 | * Wake up a interruptible task. | |
42 | * 'data' points to a wait_queue_head_t | |
43 | */ | |
44 | HOST1X_INTR_ACTION_WAKEUP_INTERRUPTIBLE, | |
45 | ||
46 | HOST1X_INTR_ACTION_COUNT | |
47 | }; | |
48 | ||
49 | struct host1x_syncpt_intr { | |
50 | spinlock_t lock; | |
51 | struct list_head wait_head; | |
52 | char thresh_irq_name[12]; | |
53 | struct work_struct work; | |
54 | }; | |
55 | ||
56 | struct host1x_waitlist { | |
57 | struct list_head list; | |
58 | struct kref refcount; | |
59 | u32 thresh; | |
60 | enum host1x_intr_action action; | |
61 | atomic_t state; | |
62 | void *data; | |
63 | int count; | |
64 | }; | |
65 | ||
66 | /* | |
67 | * Schedule an action to be taken when a sync point reaches the given threshold. | |
68 | * | |
69 | * @id the sync point | |
70 | * @thresh the threshold | |
71 | * @action the action to take | |
72 | * @data a pointer to extra data depending on action, see above | |
73 | * @waiter waiter structure - assumes ownership | |
74 | * @ref must be passed if cancellation is possible, else NULL | |
75 | * | |
76 | * This is a non-blocking api. | |
77 | */ | |
5c0d8d38 | 78 | int host1x_intr_add_action(struct host1x *host, unsigned int id, u32 thresh, |
7ede0b0b TB |
79 | enum host1x_intr_action action, void *data, |
80 | struct host1x_waitlist *waiter, void **ref); | |
81 | ||
82 | /* | |
83 | * Unreference an action submitted to host1x_intr_add_action(). | |
84 | * You must call this if you passed non-NULL as ref. | |
85 | * @ref the ref returned from host1x_intr_add_action() | |
86 | */ | |
5c0d8d38 | 87 | void host1x_intr_put_ref(struct host1x *host, unsigned int id, void *ref); |
7ede0b0b TB |
88 | |
89 | /* Initialize host1x sync point interrupt */ | |
90 | int host1x_intr_init(struct host1x *host, unsigned int irq_sync); | |
91 | ||
92 | /* Deinitialize host1x sync point interrupt */ | |
93 | void host1x_intr_deinit(struct host1x *host); | |
94 | ||
95 | /* Enable host1x sync point interrupt */ | |
96 | void host1x_intr_start(struct host1x *host); | |
97 | ||
98 | /* Disable host1x sync point interrupt */ | |
99 | void host1x_intr_stop(struct host1x *host); | |
100 | ||
101 | irqreturn_t host1x_syncpt_thresh_fn(void *dev_id); | |
102 | #endif |