]>
Commit | Line | Data |
---|---|---|
9952f691 | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
7ede0b0b TB |
2 | /* |
3 | * Tegra host1x Interrupt Management | |
4 | * | |
5 | * Copyright (c) 2010-2013, NVIDIA Corporation. | |
7ede0b0b TB |
6 | */ |
7 | ||
8 | #ifndef __HOST1X_INTR_H | |
9 | #define __HOST1X_INTR_H | |
10 | ||
11 | #include <linux/interrupt.h> | |
12 | #include <linux/workqueue.h> | |
13 | ||
ac330f45 | 14 | struct host1x_syncpt; |
7ede0b0b TB |
15 | struct host1x; |
16 | ||
17 | enum host1x_intr_action { | |
6579324a TB |
18 | /* |
19 | * Perform cleanup after a submit has completed. | |
20 | * 'data' points to a channel | |
21 | */ | |
22 | HOST1X_INTR_ACTION_SUBMIT_COMPLETE = 0, | |
23 | ||
7ede0b0b TB |
24 | /* |
25 | * Wake up a task. | |
26 | * 'data' points to a wait_queue_head_t | |
27 | */ | |
28 | HOST1X_INTR_ACTION_WAKEUP, | |
29 | ||
30 | /* | |
31 | * Wake up a interruptible task. | |
32 | * 'data' points to a wait_queue_head_t | |
33 | */ | |
34 | HOST1X_INTR_ACTION_WAKEUP_INTERRUPTIBLE, | |
35 | ||
36 | HOST1X_INTR_ACTION_COUNT | |
37 | }; | |
38 | ||
39 | struct host1x_syncpt_intr { | |
40 | spinlock_t lock; | |
41 | struct list_head wait_head; | |
42 | char thresh_irq_name[12]; | |
43 | struct work_struct work; | |
44 | }; | |
45 | ||
46 | struct host1x_waitlist { | |
47 | struct list_head list; | |
48 | struct kref refcount; | |
49 | u32 thresh; | |
50 | enum host1x_intr_action action; | |
51 | atomic_t state; | |
52 | void *data; | |
53 | int count; | |
54 | }; | |
55 | ||
56 | /* | |
57 | * Schedule an action to be taken when a sync point reaches the given threshold. | |
58 | * | |
59 | * @id the sync point | |
60 | * @thresh the threshold | |
61 | * @action the action to take | |
62 | * @data a pointer to extra data depending on action, see above | |
63 | * @waiter waiter structure - assumes ownership | |
64 | * @ref must be passed if cancellation is possible, else NULL | |
65 | * | |
66 | * This is a non-blocking api. | |
67 | */ | |
ac330f45 TR |
68 | int host1x_intr_add_action(struct host1x *host, struct host1x_syncpt *syncpt, |
69 | u32 thresh, enum host1x_intr_action action, | |
70 | void *data, struct host1x_waitlist *waiter, | |
71 | void **ref); | |
7ede0b0b TB |
72 | |
73 | /* | |
74 | * Unreference an action submitted to host1x_intr_add_action(). | |
75 | * You must call this if you passed non-NULL as ref. | |
76 | * @ref the ref returned from host1x_intr_add_action() | |
77 | */ | |
5c0d8d38 | 78 | void host1x_intr_put_ref(struct host1x *host, unsigned int id, void *ref); |
7ede0b0b TB |
79 | |
80 | /* Initialize host1x sync point interrupt */ | |
81 | int host1x_intr_init(struct host1x *host, unsigned int irq_sync); | |
82 | ||
83 | /* Deinitialize host1x sync point interrupt */ | |
84 | void host1x_intr_deinit(struct host1x *host); | |
85 | ||
86 | /* Enable host1x sync point interrupt */ | |
87 | void host1x_intr_start(struct host1x *host); | |
88 | ||
89 | /* Disable host1x sync point interrupt */ | |
90 | void host1x_intr_stop(struct host1x *host); | |
91 | ||
92 | irqreturn_t host1x_syncpt_thresh_fn(void *dev_id); | |
93 | #endif |