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 { 28 /* 29 * Perform cleanup after a submit has completed. 30 * 'data' points to a channel 31 */ 32 HOST1X_INTR_ACTION_SUBMIT_COMPLETE = 0, 33 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 */ 78 int host1x_intr_add_action(struct host1x *host, u32 id, u32 thresh, 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 */ 87 void host1x_intr_put_ref(struct host1x *host, u32 id, void *ref); 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 103