Lines Matching full:link
48 struct ocxl_link *link; member
79 * A opencapi link can be used be by several PCI functions. We have
80 * one link per device slot.
191 struct ocxl_link *link = data; in xsl_fault_handler() local
192 struct spa *spa = link->spa; in xsl_fault_handler()
277 static int setup_xsl_irq(struct pci_dev *dev, struct ocxl_link *link) in setup_xsl_irq() argument
279 struct spa *spa = link->spa; in setup_xsl_irq()
292 link->domain, link->bus, link->dev); in setup_xsl_irq()
300 * number of interrupts. Could we have an IRQ domain per link? in setup_xsl_irq()
313 link); in setup_xsl_irq()
332 static void release_xsl_irq(struct ocxl_link *link) in release_xsl_irq() argument
334 struct spa *spa = link->spa; in release_xsl_irq()
337 free_irq(spa->virq, link); in release_xsl_irq()
344 static int alloc_spa(struct pci_dev *dev, struct ocxl_link *link) in alloc_spa() argument
364 pr_debug("Allocated SPA for %x:%x:%x at %p\n", link->domain, link->bus, in alloc_spa()
365 link->dev, spa->spa_mem); in alloc_spa()
367 link->spa = spa; in alloc_spa()
371 static void free_spa(struct ocxl_link *link) in free_spa() argument
373 struct spa *spa = link->spa; in free_spa()
375 pr_debug("Freeing SPA for %x:%x:%x\n", link->domain, link->bus, in free_spa()
376 link->dev); in free_spa()
381 link->spa = NULL; in free_spa()
387 struct ocxl_link *link; in alloc_link() local
390 link = kzalloc(sizeof(struct ocxl_link), GFP_KERNEL); in alloc_link()
391 if (!link) in alloc_link()
394 kref_init(&link->ref); in alloc_link()
395 link->domain = pci_domain_nr(dev->bus); in alloc_link()
396 link->bus = dev->bus->number; in alloc_link()
397 link->dev = PCI_SLOT(dev->devfn); in alloc_link()
398 atomic_set(&link->irq_available, MAX_IRQ_PER_LINK); in alloc_link()
399 spin_lock_init(&link->atsd_lock); in alloc_link()
401 rc = alloc_spa(dev, link); in alloc_link()
405 rc = setup_xsl_irq(dev, link); in alloc_link()
410 rc = pnv_ocxl_spa_setup(dev, link->spa->spa_mem, PE_mask, in alloc_link()
411 &link->platform_data); in alloc_link()
415 /* if link->arva is not defeined, MMIO registers are not used to in alloc_link()
420 pnv_ocxl_map_lpar(dev, mfspr(SPRN_LPID), 0, &link->arva); in alloc_link()
422 *out_link = link; in alloc_link()
426 release_xsl_irq(link); in alloc_link()
428 free_spa(link); in alloc_link()
430 kfree(link); in alloc_link()
434 static void free_link(struct ocxl_link *link) in free_link() argument
436 release_xsl_irq(link); in free_link()
437 free_spa(link); in free_link()
438 kfree(link); in free_link()
444 struct ocxl_link *link; in ocxl_link_setup() local
447 list_for_each_entry(link, &links_list, list) { in ocxl_link_setup()
448 /* The functions of a device all share the same link */ in ocxl_link_setup()
449 if (link->domain == pci_domain_nr(dev->bus) && in ocxl_link_setup()
450 link->bus == dev->bus->number && in ocxl_link_setup()
451 link->dev == PCI_SLOT(dev->devfn)) { in ocxl_link_setup()
452 kref_get(&link->ref); in ocxl_link_setup()
453 *link_handle = link; in ocxl_link_setup()
457 rc = alloc_link(dev, PE_mask, &link); in ocxl_link_setup()
461 list_add(&link->list, &links_list); in ocxl_link_setup()
462 *link_handle = link; in ocxl_link_setup()
471 struct ocxl_link *link = container_of(ref, struct ocxl_link, ref); in release_xsl() local
473 if (link->arva) { in release_xsl()
474 pnv_ocxl_unmap_lpar(link->arva); in release_xsl()
475 link->arva = NULL; in release_xsl()
478 list_del(&link->list); in release_xsl()
480 pnv_ocxl_spa_release(link->platform_data); in release_xsl()
481 free_link(link); in release_xsl()
486 struct ocxl_link *link = link_handle; in ocxl_link_release() local
489 kref_put(&link->ref, release_xsl); in ocxl_link_release()
499 struct ocxl_link *link = pe_data->link; in arch_invalidate_secondary_tlbs() local
505 spin_lock(&link->atsd_lock); in arch_invalidate_secondary_tlbs()
507 pnv_ocxl_tlb_invalidate(link->arva, pid, addr, page_size); in arch_invalidate_secondary_tlbs()
508 spin_unlock(&link->atsd_lock); in arch_invalidate_secondary_tlbs()
543 struct ocxl_link *link = link_handle; in ocxl_link_add_pe() local
544 struct spa *spa = link->spa; in ocxl_link_add_pe()
571 pe_data->link = link; in ocxl_link_add_pe()
591 if (link->arva) { in ocxl_link_add_pe()
633 struct ocxl_link *link = link_handle; in ocxl_link_update_pe() local
634 struct spa *spa = link->spa; in ocxl_link_update_pe()
660 rc = pnv_ocxl_spa_remove_pe_from_cache(link->platform_data, pe_handle); in ocxl_link_update_pe()
669 struct ocxl_link *link = link_handle; in ocxl_link_remove_pe() local
670 struct spa *spa = link->spa; in ocxl_link_remove_pe()
722 rc = pnv_ocxl_spa_remove_pe_from_cache(link->platform_data, pe_handle); in ocxl_link_remove_pe()
730 if (link->arva) { in ocxl_link_remove_pe()
735 spin_lock(&link->atsd_lock); in ocxl_link_remove_pe()
736 pnv_ocxl_tlb_invalidate(link->arva, in ocxl_link_remove_pe()
740 spin_unlock(&link->atsd_lock); in ocxl_link_remove_pe()
755 struct ocxl_link *link = link_handle; in ocxl_link_irq_alloc() local
758 if (atomic_dec_if_positive(&link->irq_available) < 0) in ocxl_link_irq_alloc()
763 atomic_inc(&link->irq_available); in ocxl_link_irq_alloc()
774 struct ocxl_link *link = link_handle; in ocxl_link_free_irq() local
777 atomic_inc(&link->irq_available); in ocxl_link_free_irq()