Lines Matching refs:spa
46 struct spa { struct
87 struct spa *spa; member
100 static void read_irq(struct spa *spa, u64 *dsisr, u64 *dar, u64 *pe) in read_irq() argument
104 *dsisr = in_be64(spa->reg_dsisr); in read_irq()
105 *dar = in_be64(spa->reg_dar); in read_irq()
106 reg = in_be64(spa->reg_pe_handle); in read_irq()
110 static void ack_irq(struct spa *spa, enum xsl_response r) in ack_irq() argument
123 trace_ocxl_fault_ack(spa->spa_mem, spa->xsl_fault.pe, in ack_irq()
124 spa->xsl_fault.dsisr, spa->xsl_fault.dar, reg); in ack_irq()
125 out_be64(spa->reg_tfc, reg); in ack_irq()
136 struct spa *spa = container_of(fault, struct spa, xsl_fault); in xsl_fault_handler_bh() local
178 ack_irq(spa, r); in xsl_fault_handler_bh()
184 struct spa *spa = link->spa; in xsl_fault_handler() local
191 read_irq(spa, &dsisr, &dar, &pe_handle); in xsl_fault_handler()
192 trace_ocxl_fault(spa->spa_mem, pe_handle, dsisr, dar, -1); in xsl_fault_handler()
195 pe = spa->spa_mem + pe_handle; in xsl_fault_handler()
206 ack_irq(spa, ADDRESS_ERROR); in xsl_fault_handler()
211 pe_data = radix_tree_lookup(&spa->pe_tree, pe_handle); in xsl_fault_handler()
225 ack_irq(spa, ADDRESS_ERROR); in xsl_fault_handler()
236 ack_irq(spa, ADDRESS_ERROR); in xsl_fault_handler()
242 spa->xsl_fault.pe = pe_handle; in xsl_fault_handler()
243 spa->xsl_fault.dar = dar; in xsl_fault_handler()
244 spa->xsl_fault.dsisr = dsisr; in xsl_fault_handler()
245 spa->xsl_fault.pe_data = *pe_data; in xsl_fault_handler()
251 schedule_work(&spa->xsl_fault.fault_work); in xsl_fault_handler()
253 ack_irq(spa, ADDRESS_ERROR); in xsl_fault_handler()
257 static void unmap_irq_registers(struct spa *spa) in unmap_irq_registers() argument
259 pnv_ocxl_unmap_xsl_regs(spa->reg_dsisr, spa->reg_dar, spa->reg_tfc, in unmap_irq_registers()
260 spa->reg_pe_handle); in unmap_irq_registers()
263 static int map_irq_registers(struct pci_dev *dev, struct spa *spa) in map_irq_registers() argument
265 return pnv_ocxl_map_xsl_regs(dev, &spa->reg_dsisr, &spa->reg_dar, in map_irq_registers()
266 &spa->reg_tfc, &spa->reg_pe_handle); in map_irq_registers()
271 struct spa *spa = link->spa; in setup_xsl_irq() local
279 rc = map_irq_registers(dev, spa); in setup_xsl_irq()
283 spa->irq_name = kasprintf(GFP_KERNEL, "ocxl-xsl-%x-%x-%x", in setup_xsl_irq()
285 if (!spa->irq_name) { in setup_xsl_irq()
294 spa->virq = irq_create_mapping(NULL, hwirq); in setup_xsl_irq()
295 if (!spa->virq) { in setup_xsl_irq()
302 dev_dbg(&dev->dev, "hwirq %d mapped to virq %d\n", hwirq, spa->virq); in setup_xsl_irq()
304 rc = request_irq(spa->virq, xsl_fault_handler, 0, spa->irq_name, in setup_xsl_irq()
316 irq_dispose_mapping(spa->virq); in setup_xsl_irq()
318 kfree(spa->irq_name); in setup_xsl_irq()
320 unmap_irq_registers(spa); in setup_xsl_irq()
326 struct spa *spa = link->spa; in release_xsl_irq() local
328 if (spa->virq) { in release_xsl_irq()
329 free_irq(spa->virq, link); in release_xsl_irq()
330 irq_dispose_mapping(spa->virq); in release_xsl_irq()
332 kfree(spa->irq_name); in release_xsl_irq()
333 unmap_irq_registers(spa); in release_xsl_irq()
338 struct spa *spa; in alloc_spa() local
340 spa = kzalloc(sizeof(struct spa), GFP_KERNEL); in alloc_spa()
341 if (!spa) in alloc_spa()
344 mutex_init(&spa->spa_lock); in alloc_spa()
345 INIT_RADIX_TREE(&spa->pe_tree, GFP_KERNEL); in alloc_spa()
346 INIT_WORK(&spa->xsl_fault.fault_work, xsl_fault_handler_bh); in alloc_spa()
348 spa->spa_order = SPA_SPA_SIZE_LOG - PAGE_SHIFT; in alloc_spa()
349 spa->spa_mem = (struct ocxl_process_element *) in alloc_spa()
350 __get_free_pages(GFP_KERNEL | __GFP_ZERO, spa->spa_order); in alloc_spa()
351 if (!spa->spa_mem) { in alloc_spa()
353 kfree(spa); in alloc_spa()
357 link->dev, spa->spa_mem); in alloc_spa()
359 link->spa = spa; in alloc_spa()
365 struct spa *spa = link->spa; in free_spa() local
370 if (spa && spa->spa_mem) { in free_spa()
371 free_pages((unsigned long) spa->spa_mem, spa->spa_order); in free_spa()
372 kfree(spa); in free_spa()
373 link->spa = NULL; in free_spa()
401 rc = pnv_ocxl_spa_setup(dev, link->spa->spa_mem, PE_mask, in alloc_link()
502 struct spa *spa = link->spa; in ocxl_link_add_pe() local
511 mutex_lock(&spa->spa_lock); in ocxl_link_add_pe()
513 pe = spa->spa_mem + pe_handle; in ocxl_link_add_pe()
551 radix_tree_insert(&spa->pe_tree, pe_handle, pe_data); in ocxl_link_add_pe()
569 trace_ocxl_context_add(current->pid, spa->spa_mem, pasid, pidr, tidr); in ocxl_link_add_pe()
571 mutex_unlock(&spa->spa_lock); in ocxl_link_add_pe()
579 struct spa *spa = link->spa; in ocxl_link_update_pe() local
587 pe = spa->spa_mem + pe_handle; in ocxl_link_update_pe()
589 mutex_lock(&spa->spa_lock); in ocxl_link_update_pe()
608 mutex_unlock(&spa->spa_lock); in ocxl_link_update_pe()
615 struct spa *spa = link->spa; in ocxl_link_remove_pe() local
642 pe = spa->spa_mem + pe_handle; in ocxl_link_remove_pe()
644 mutex_lock(&spa->spa_lock); in ocxl_link_remove_pe()
651 trace_ocxl_context_remove(current->pid, spa->spa_mem, pasid, in ocxl_link_remove_pe()
670 pe_data = radix_tree_delete(&spa->pe_tree, pe_handle); in ocxl_link_remove_pe()
681 mutex_unlock(&spa->spa_lock); in ocxl_link_remove_pe()