Lines Matching refs:spa
52 struct spa { struct
95 struct spa *spa; argument
108 static void read_irq(struct spa *spa, u64 *dsisr, u64 *dar, u64 *pe) in read_irq() argument
112 *dsisr = in_be64(spa->reg_dsisr); in read_irq()
113 *dar = in_be64(spa->reg_dar); in read_irq()
114 reg = in_be64(spa->reg_pe_handle); in read_irq()
118 static void ack_irq(struct spa *spa, enum xsl_response r) in ack_irq() argument
131 trace_ocxl_fault_ack(spa->spa_mem, spa->xsl_fault.pe, in ack_irq()
132 spa->xsl_fault.dsisr, spa->xsl_fault.dar, reg); in ack_irq()
133 out_be64(spa->reg_tfc, reg); in ack_irq()
144 struct spa *spa = container_of(fault, struct spa, xsl_fault); in xsl_fault_handler_bh() local
186 ack_irq(spa, r); in xsl_fault_handler_bh()
192 struct spa *spa = link->spa; in xsl_fault_handler() local
199 read_irq(spa, &dsisr, &dar, &pe_handle); in xsl_fault_handler()
200 trace_ocxl_fault(spa->spa_mem, pe_handle, dsisr, dar, -1); in xsl_fault_handler()
203 pe = spa->spa_mem + pe_handle; in xsl_fault_handler()
214 ack_irq(spa, ADDRESS_ERROR); in xsl_fault_handler()
219 pe_data = radix_tree_lookup(&spa->pe_tree, pe_handle); in xsl_fault_handler()
233 ack_irq(spa, ADDRESS_ERROR); in xsl_fault_handler()
244 ack_irq(spa, ADDRESS_ERROR); in xsl_fault_handler()
250 spa->xsl_fault.pe = pe_handle; in xsl_fault_handler()
251 spa->xsl_fault.dar = dar; in xsl_fault_handler()
252 spa->xsl_fault.dsisr = dsisr; in xsl_fault_handler()
253 spa->xsl_fault.pe_data = *pe_data; in xsl_fault_handler()
259 schedule_work(&spa->xsl_fault.fault_work); in xsl_fault_handler()
261 ack_irq(spa, ADDRESS_ERROR); in xsl_fault_handler()
265 static void unmap_irq_registers(struct spa *spa) in unmap_irq_registers() argument
267 pnv_ocxl_unmap_xsl_regs(spa->reg_dsisr, spa->reg_dar, spa->reg_tfc, in unmap_irq_registers()
268 spa->reg_pe_handle); in unmap_irq_registers()
271 static int map_irq_registers(struct pci_dev *dev, struct spa *spa) in map_irq_registers() argument
273 return pnv_ocxl_map_xsl_regs(dev, &spa->reg_dsisr, &spa->reg_dar, in map_irq_registers()
274 &spa->reg_tfc, &spa->reg_pe_handle); in map_irq_registers()
279 struct spa *spa = link->spa; in setup_xsl_irq() local
287 rc = map_irq_registers(dev, spa); in setup_xsl_irq()
291 spa->irq_name = kasprintf(GFP_KERNEL, "ocxl-xsl-%x-%x-%x", in setup_xsl_irq()
293 if (!spa->irq_name) { in setup_xsl_irq()
302 spa->virq = irq_create_mapping(NULL, hwirq); in setup_xsl_irq()
303 if (!spa->virq) { in setup_xsl_irq()
310 dev_dbg(&dev->dev, "hwirq %d mapped to virq %d\n", hwirq, spa->virq); in setup_xsl_irq()
312 rc = request_irq(spa->virq, xsl_fault_handler, 0, spa->irq_name, in setup_xsl_irq()
324 irq_dispose_mapping(spa->virq); in setup_xsl_irq()
326 kfree(spa->irq_name); in setup_xsl_irq()
328 unmap_irq_registers(spa); in setup_xsl_irq()
334 struct spa *spa = link->spa; in release_xsl_irq() local
336 if (spa->virq) { in release_xsl_irq()
337 free_irq(spa->virq, link); in release_xsl_irq()
338 irq_dispose_mapping(spa->virq); in release_xsl_irq()
340 kfree(spa->irq_name); in release_xsl_irq()
341 unmap_irq_registers(spa); in release_xsl_irq()
346 struct spa *spa; in alloc_spa() local
348 spa = kzalloc(sizeof(struct spa), GFP_KERNEL); in alloc_spa()
349 if (!spa) in alloc_spa()
352 mutex_init(&spa->spa_lock); in alloc_spa()
353 INIT_RADIX_TREE(&spa->pe_tree, GFP_KERNEL); in alloc_spa()
354 INIT_WORK(&spa->xsl_fault.fault_work, xsl_fault_handler_bh); in alloc_spa()
356 spa->spa_order = SPA_SPA_SIZE_LOG - PAGE_SHIFT; in alloc_spa()
357 spa->spa_mem = (struct ocxl_process_element *) in alloc_spa()
358 __get_free_pages(GFP_KERNEL | __GFP_ZERO, spa->spa_order); in alloc_spa()
359 if (!spa->spa_mem) { in alloc_spa()
361 kfree(spa); in alloc_spa()
365 link->dev, spa->spa_mem); in alloc_spa()
367 link->spa = spa; in alloc_spa()
373 struct spa *spa = link->spa; in free_spa() local
378 if (spa && spa->spa_mem) { in free_spa()
379 free_pages((unsigned long) spa->spa_mem, spa->spa_order); in free_spa()
380 kfree(spa); in free_spa()
381 link->spa = NULL; in free_spa()
410 rc = pnv_ocxl_spa_setup(dev, link->spa->spa_mem, PE_mask, in alloc_link()
544 struct spa *spa = link->spa; in ocxl_link_add_pe() local
553 mutex_lock(&spa->spa_lock); in ocxl_link_add_pe()
555 pe = spa->spa_mem + pe_handle; in ocxl_link_add_pe()
606 radix_tree_insert(&spa->pe_tree, pe_handle, pe_data); in ocxl_link_add_pe()
624 trace_ocxl_context_add(current->pid, spa->spa_mem, pasid, pidr, tidr); in ocxl_link_add_pe()
626 mutex_unlock(&spa->spa_lock); in ocxl_link_add_pe()
634 struct spa *spa = link->spa; in ocxl_link_update_pe() local
642 pe = spa->spa_mem + pe_handle; in ocxl_link_update_pe()
644 mutex_lock(&spa->spa_lock); in ocxl_link_update_pe()
663 mutex_unlock(&spa->spa_lock); in ocxl_link_update_pe()
670 struct spa *spa = link->spa; in ocxl_link_remove_pe() local
697 pe = spa->spa_mem + pe_handle; in ocxl_link_remove_pe()
699 mutex_lock(&spa->spa_lock); in ocxl_link_remove_pe()
706 trace_ocxl_context_remove(current->pid, spa->spa_mem, pasid, in ocxl_link_remove_pe()
725 pe_data = radix_tree_delete(&spa->pe_tree, pe_handle); in ocxl_link_remove_pe()
748 mutex_unlock(&spa->spa_lock); in ocxl_link_remove_pe()