Lines Matching defs:spa

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