Lines Matching refs:spa

45 struct spa {  struct
86 struct spa *spa; argument
99 static void read_irq(struct spa *spa, u64 *dsisr, u64 *dar, u64 *pe) in read_irq() argument
103 *dsisr = in_be64(spa->reg_dsisr); in read_irq()
104 *dar = in_be64(spa->reg_dar); in read_irq()
105 reg = in_be64(spa->reg_pe_handle); in read_irq()
109 static void ack_irq(struct spa *spa, enum xsl_response r) in ack_irq() argument
122 trace_ocxl_fault_ack(spa->spa_mem, spa->xsl_fault.pe, in ack_irq()
123 spa->xsl_fault.dsisr, spa->xsl_fault.dar, reg); in ack_irq()
124 out_be64(spa->reg_tfc, reg); in ack_irq()
135 struct spa *spa = container_of(fault, struct spa, xsl_fault); in xsl_fault_handler_bh() local
177 ack_irq(spa, r); in xsl_fault_handler_bh()
183 struct spa *spa = link->spa; in xsl_fault_handler() local
190 read_irq(spa, &dsisr, &dar, &pe_handle); in xsl_fault_handler()
191 trace_ocxl_fault(spa->spa_mem, pe_handle, dsisr, dar, -1); in xsl_fault_handler()
194 pe = spa->spa_mem + pe_handle; in xsl_fault_handler()
205 ack_irq(spa, ADDRESS_ERROR); in xsl_fault_handler()
210 pe_data = radix_tree_lookup(&spa->pe_tree, pe_handle); in xsl_fault_handler()
224 ack_irq(spa, ADDRESS_ERROR); in xsl_fault_handler()
235 ack_irq(spa, ADDRESS_ERROR); in xsl_fault_handler()
241 spa->xsl_fault.pe = pe_handle; in xsl_fault_handler()
242 spa->xsl_fault.dar = dar; in xsl_fault_handler()
243 spa->xsl_fault.dsisr = dsisr; in xsl_fault_handler()
244 spa->xsl_fault.pe_data = *pe_data; in xsl_fault_handler()
250 schedule_work(&spa->xsl_fault.fault_work); in xsl_fault_handler()
252 ack_irq(spa, ADDRESS_ERROR); in xsl_fault_handler()
256 static void unmap_irq_registers(struct spa *spa) in unmap_irq_registers() argument
258 pnv_ocxl_unmap_xsl_regs(spa->reg_dsisr, spa->reg_dar, spa->reg_tfc, in unmap_irq_registers()
259 spa->reg_pe_handle); in unmap_irq_registers()
262 static int map_irq_registers(struct pci_dev *dev, struct spa *spa) in map_irq_registers() argument
264 return pnv_ocxl_map_xsl_regs(dev, &spa->reg_dsisr, &spa->reg_dar, in map_irq_registers()
265 &spa->reg_tfc, &spa->reg_pe_handle); in map_irq_registers()
270 struct spa *spa = link->spa; in setup_xsl_irq() local
278 rc = map_irq_registers(dev, spa); in setup_xsl_irq()
282 spa->irq_name = kasprintf(GFP_KERNEL, "ocxl-xsl-%x-%x-%x", in setup_xsl_irq()
284 if (!spa->irq_name) { in setup_xsl_irq()
293 spa->virq = irq_create_mapping(NULL, hwirq); in setup_xsl_irq()
294 if (!spa->virq) { in setup_xsl_irq()
301 dev_dbg(&dev->dev, "hwirq %d mapped to virq %d\n", hwirq, spa->virq); in setup_xsl_irq()
303 rc = request_irq(spa->virq, xsl_fault_handler, 0, spa->irq_name, in setup_xsl_irq()
315 irq_dispose_mapping(spa->virq); in setup_xsl_irq()
317 kfree(spa->irq_name); in setup_xsl_irq()
319 unmap_irq_registers(spa); in setup_xsl_irq()
325 struct spa *spa = link->spa; in release_xsl_irq() local
327 if (spa->virq) { in release_xsl_irq()
328 free_irq(spa->virq, link); in release_xsl_irq()
329 irq_dispose_mapping(spa->virq); in release_xsl_irq()
331 kfree(spa->irq_name); in release_xsl_irq()
332 unmap_irq_registers(spa); in release_xsl_irq()
337 struct spa *spa; in alloc_spa() local
339 spa = kzalloc(sizeof(struct spa), GFP_KERNEL); in alloc_spa()
340 if (!spa) in alloc_spa()
343 mutex_init(&spa->spa_lock); in alloc_spa()
344 INIT_RADIX_TREE(&spa->pe_tree, GFP_KERNEL); in alloc_spa()
345 INIT_WORK(&spa->xsl_fault.fault_work, xsl_fault_handler_bh); in alloc_spa()
347 spa->spa_order = SPA_SPA_SIZE_LOG - PAGE_SHIFT; in alloc_spa()
348 spa->spa_mem = (struct ocxl_process_element *) in alloc_spa()
349 __get_free_pages(GFP_KERNEL | __GFP_ZERO, spa->spa_order); in alloc_spa()
350 if (!spa->spa_mem) { in alloc_spa()
352 kfree(spa); in alloc_spa()
356 link->dev, spa->spa_mem); in alloc_spa()
358 link->spa = spa; in alloc_spa()
364 struct spa *spa = link->spa; in free_spa() local
369 if (spa && spa->spa_mem) { in free_spa()
370 free_pages((unsigned long) spa->spa_mem, spa->spa_order); in free_spa()
371 kfree(spa); in free_spa()
372 link->spa = NULL; in free_spa()
400 rc = pnv_ocxl_spa_setup(dev, link->spa->spa_mem, PE_mask, in alloc_link()
501 struct spa *spa = link->spa; in ocxl_link_add_pe() local
510 mutex_lock(&spa->spa_lock); in ocxl_link_add_pe()
512 pe = spa->spa_mem + pe_handle; in ocxl_link_add_pe()
550 radix_tree_insert(&spa->pe_tree, pe_handle, pe_data); in ocxl_link_add_pe()
568 trace_ocxl_context_add(current->pid, spa->spa_mem, pasid, pidr, tidr); in ocxl_link_add_pe()
570 mutex_unlock(&spa->spa_lock); in ocxl_link_add_pe()
578 struct spa *spa = link->spa; in ocxl_link_update_pe() local
586 pe = spa->spa_mem + pe_handle; in ocxl_link_update_pe()
588 mutex_lock(&spa->spa_lock); in ocxl_link_update_pe()
607 mutex_unlock(&spa->spa_lock); in ocxl_link_update_pe()
614 struct spa *spa = link->spa; in ocxl_link_remove_pe() local
641 pe = spa->spa_mem + pe_handle; in ocxl_link_remove_pe()
643 mutex_lock(&spa->spa_lock); in ocxl_link_remove_pe()
650 trace_ocxl_context_remove(current->pid, spa->spa_mem, pasid, in ocxl_link_remove_pe()
669 pe_data = radix_tree_delete(&spa->pe_tree, pe_handle); in ocxl_link_remove_pe()
680 mutex_unlock(&spa->spa_lock); in ocxl_link_remove_pe()