Lines Matching +full:irq +full:- +full:can +full:- +full:wake

1 // SPDX-License-Identifier: GPL-2.0+
21 * The maximum FIFO size for fault window can be 8MB
24 * 8MB FIFO can be used if expects more faults for each VAS
31 unsigned long *end = vinst->fault_fifo + vinst->fault_fifo_size; in dump_fifo()
35 pr_err("Fault fifo size %d, Max crbs %d\n", vinst->fault_fifo_size, in dump_fifo()
36 vinst->fault_fifo_size / CRB_SIZE); in dump_fifo()
54 * pswid - window ID of the window on which the request is sent.
55 * fault_storage_addr - fault address
57 * It can raise a single interrupt for multiple faults. Expects OS to
60 * credit mechanism. NX can continuously paste CRBs until credits are not
66 irqreturn_t vas_fault_thread_fn(int irq, void *data) in vas_fault_thread_fn() argument
78 * VAS can interrupt with multiple page faults. So process all in vas_fault_thread_fn()
84 * pswid NX assigns window ID. Set pswid to -1 after in vas_fault_thread_fn()
94 * and return IRQ_WAKE_THREAD to wake up thread. in vas_fault_thread_fn()
97 spin_lock_irqsave(&vinst->fault_lock, flags); in vas_fault_thread_fn()
104 fifo = vinst->fault_fifo + (vinst->fault_crbs * CRB_SIZE); in vas_fault_thread_fn()
107 if ((entry->stamp.nx.pswid == cpu_to_be32(FIFO_INVALID_ENTRY)) in vas_fault_thread_fn()
108 || (entry->ccw & cpu_to_be32(CCW0_INVALID))) { in vas_fault_thread_fn()
109 vinst->fifo_in_progress = 0; in vas_fault_thread_fn()
110 spin_unlock_irqrestore(&vinst->fault_lock, flags); in vas_fault_thread_fn()
114 spin_unlock_irqrestore(&vinst->fault_lock, flags); in vas_fault_thread_fn()
115 vinst->fault_crbs++; in vas_fault_thread_fn()
116 if (vinst->fault_crbs == (vinst->fault_fifo_size / CRB_SIZE)) in vas_fault_thread_fn()
117 vinst->fault_crbs = 0; in vas_fault_thread_fn()
120 entry->stamp.nx.pswid = cpu_to_be32(FIFO_INVALID_ENTRY); in vas_fault_thread_fn()
121 entry->ccw |= cpu_to_be32(CCW0_INVALID); in vas_fault_thread_fn()
125 vas_return_credit(vinst->fault_win, false); in vas_fault_thread_fn()
128 vinst->vas_id, vinst->fault_fifo, fifo, in vas_fault_thread_fn()
129 vinst->fault_crbs); in vas_fault_thread_fn()
133 be32_to_cpu(crb->stamp.nx.pswid)); in vas_fault_thread_fn()
138 * window but we can't find that window and we can't in vas_fault_thread_fn()
142 * TODO: Disable IRQ. in vas_fault_thread_fn()
146 vinst->vas_id, vinst->fault_fifo, fifo, in vas_fault_thread_fn()
147 be32_to_cpu(crb->stamp.nx.pswid), in vas_fault_thread_fn()
148 vinst->fault_crbs); in vas_fault_thread_fn()
155 if (window->user_win) in vas_fault_thread_fn()
156 vas_update_csb(crb, &window->vas_win.task_ref); in vas_fault_thread_fn()
158 WARN_ON_ONCE(!window->user_win); in vas_fault_thread_fn()
169 irqreturn_t vas_fault_handler(int irq, void *dev_id) in vas_fault_handler() argument
176 * NX can generate an interrupt for multiple faults. So the in vas_fault_handler()
180 * can execute and process all valid CRBs. in vas_fault_handler()
181 * So wake up thread only if the fault thread is not in progress. in vas_fault_handler()
183 spin_lock_irqsave(&vinst->fault_lock, flags); in vas_fault_handler()
185 if (vinst->fifo_in_progress) in vas_fault_handler()
188 vinst->fifo_in_progress = 1; in vas_fault_handler()
190 spin_unlock_irqrestore(&vinst->fault_lock, flags); in vas_fault_handler()
204 vinst->fault_fifo_size = VAS_FAULT_WIN_FIFO_SIZE; in vas_setup_fault_window()
205 vinst->fault_fifo = kzalloc(vinst->fault_fifo_size, GFP_KERNEL); in vas_setup_fault_window()
206 if (!vinst->fault_fifo) { in vas_setup_fault_window()
208 vinst->fault_fifo_size); in vas_setup_fault_window()
209 return -ENOMEM; in vas_setup_fault_window()
215 memset(vinst->fault_fifo, FIFO_INVALID_ENTRY, vinst->fault_fifo_size); in vas_setup_fault_window()
218 attr.rx_fifo_size = vinst->fault_fifo_size; in vas_setup_fault_window()
219 attr.rx_fifo = __pa(vinst->fault_fifo); in vas_setup_fault_window()
222 * Max creds is based on number of CRBs can fit in the FIFO. in vas_setup_fault_window()
226 attr.wcreds_max = vinst->fault_fifo_size / CRB_SIZE; in vas_setup_fault_window()
231 win = vas_rx_win_open(vinst->vas_id, VAS_COP_TYPE_FAULT, &attr); in vas_setup_fault_window()
234 kfree(vinst->fault_fifo); in vas_setup_fault_window()
238 vinst->fault_win = container_of(win, struct pnv_vas_window, vas_win); in vas_setup_fault_window()
241 vinst->fault_win->vas_win.winid, attr.lnotify_lpid, in vas_setup_fault_window()