Lines Matching +full:reserved +full:- +full:cpu +full:- +full:vectors

1 // SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause
3 * Copyright 2018-2025 Amazon.com, Inc. or its affiliates. All rights reserved.
50 ibdev_err(&dev->ibdev, in unimplemented_aenq_handler()
58 atomic64_inc(&dev->stats.keep_alive_rcvd); in efa_keep_alive()
70 struct pci_dev *pdev = dev->pdev; in efa_release_bars()
79 u16 cqn = eqe->u.comp_event.cqn; in efa_process_comp_eqe()
83 cq = xa_load(&dev->cqs_xa, cqn); in efa_process_comp_eqe()
85 ibdev_err_ratelimited(&dev->ibdev, in efa_process_comp_eqe()
86 "Completion event on non-existent CQ[%u]", in efa_process_comp_eqe()
91 cq->ibcq.comp_handler(&cq->ibcq, cq->ibcq.cq_context); in efa_process_comp_eqe()
96 struct efa_dev *dev = container_of(eeq->edev, struct efa_dev, edev); in efa_process_eqe()
98 if (likely(EFA_GET(&eqe->common, EFA_ADMIN_EQE_EVENT_TYPE) == in efa_process_eqe()
102 ibdev_err_ratelimited(&dev->ibdev, in efa_process_eqe()
104 EFA_GET(&eqe->common, in efa_process_eqe()
111 struct efa_com_dev *edev = eq->eeq.edev; in efa_intr_msix_comp()
113 efa_com_eq_comp_intr_handler(edev, &eq->eeq); in efa_intr_msix_comp()
122 efa_com_admin_q_comp_intr_handler(&dev->edev); in efa_intr_msix_mgmnt()
123 efa_com_aenq_intr_handler(&dev->edev, data); in efa_intr_msix_mgmnt()
132 err = request_irq(irq->irqn, irq->handler, 0, irq->name, irq->data); in efa_request_irq()
134 dev_err(&dev->pdev->dev, "Failed to request irq %s (%d)\n", in efa_request_irq()
135 irq->name, err); in efa_request_irq()
139 irq_set_affinity_hint(irq->irqn, &irq->affinity_hint_mask); in efa_request_irq()
146 u32 cpu; in efa_setup_comp_irq() local
148 cpu = vector - EFA_COMP_EQS_VEC_BASE; in efa_setup_comp_irq()
149 snprintf(eq->irq.name, EFA_IRQNAME_SIZE, "efa-comp%d@pci:%s", cpu, in efa_setup_comp_irq()
150 pci_name(dev->pdev)); in efa_setup_comp_irq()
151 eq->irq.handler = efa_intr_msix_comp; in efa_setup_comp_irq()
152 eq->irq.data = eq; in efa_setup_comp_irq()
153 eq->irq.vector = vector; in efa_setup_comp_irq()
154 eq->irq.irqn = pci_irq_vector(dev->pdev, vector); in efa_setup_comp_irq()
155 cpumask_set_cpu(cpu, &eq->irq.affinity_hint_mask); in efa_setup_comp_irq()
160 irq_set_affinity_hint(irq->irqn, NULL); in efa_free_irq()
161 free_irq(irq->irqn, irq->data); in efa_free_irq()
166 u32 cpu; in efa_setup_mgmnt_irq() local
168 snprintf(dev->admin_irq.name, EFA_IRQNAME_SIZE, in efa_setup_mgmnt_irq()
169 "efa-mgmnt@pci:%s", pci_name(dev->pdev)); in efa_setup_mgmnt_irq()
170 dev->admin_irq.handler = efa_intr_msix_mgmnt; in efa_setup_mgmnt_irq()
171 dev->admin_irq.data = dev; in efa_setup_mgmnt_irq()
172 dev->admin_irq.vector = dev->admin_msix_vector_idx; in efa_setup_mgmnt_irq()
173 dev->admin_irq.irqn = pci_irq_vector(dev->pdev, in efa_setup_mgmnt_irq()
174 dev->admin_msix_vector_idx); in efa_setup_mgmnt_irq()
175 cpu = cpumask_first(cpu_online_mask); in efa_setup_mgmnt_irq()
176 cpumask_set_cpu(cpu, in efa_setup_mgmnt_irq()
177 &dev->admin_irq.affinity_hint_mask); in efa_setup_mgmnt_irq()
178 dev_info(&dev->pdev->dev, "Setup irq:%d name:%s\n", in efa_setup_mgmnt_irq()
179 dev->admin_irq.irqn, in efa_setup_mgmnt_irq()
180 dev->admin_irq.name); in efa_setup_mgmnt_irq()
187 return efa_request_irq(dev, &dev->admin_irq); in efa_set_mgmnt_irq()
192 u8 db_bar_idx = dev->dev_attr.db_bar; in efa_request_doorbell_bar()
193 struct pci_dev *pdev = dev->pdev; in efa_request_doorbell_bar()
202 dev_err(&pdev->dev, in efa_request_doorbell_bar()
205 return -ENODEV; in efa_request_doorbell_bar()
210 dev_err(&pdev->dev, in efa_request_doorbell_bar()
217 dev->db_bar_addr = pci_resource_start(dev->pdev, db_bar_idx); in efa_request_doorbell_bar()
218 dev->db_bar_len = pci_resource_len(dev->pdev, db_bar_idx); in efa_request_doorbell_bar()
225 if (!(BIT(dev->dev_attr.db_bar) & EFA_BASE_BAR_MASK)) in efa_release_doorbell_bar()
226 efa_release_bars(dev, BIT(dev->dev_attr.db_bar)); in efa_release_doorbell_bar()
232 struct efa_com_dev *edev = &dev->edev; in efa_update_hw_hints()
234 if (hw_hints->mmio_read_timeout) in efa_update_hw_hints()
235 edev->mmio_read.mmio_read_timeout = in efa_update_hw_hints()
236 hw_hints->mmio_read_timeout * 1000; in efa_update_hw_hints()
238 if (hw_hints->poll_interval) in efa_update_hw_hints()
239 edev->aq.poll_interval = hw_hints->poll_interval; in efa_update_hw_hints()
241 if (hw_hints->admin_completion_timeout) in efa_update_hw_hints()
242 edev->aq.completion_timeout = in efa_update_hw_hints()
243 hw_hints->admin_completion_timeout; in efa_update_hw_hints()
248 atomic64_t *s = (atomic64_t *)&dev->stats; in efa_stats_init()
251 for (i = 0; i < sizeof(dev->stats) / sizeof(*s); i++, s++) in efa_stats_init()
263 if (!efa_com_check_supported_feature_id(&dev->edev, in efa_set_host_info()
268 hinf = dma_alloc_coherent(&dev->pdev->dev, bufsz, &hinf_dma, in efa_set_host_info()
273 strscpy(hinf->os_dist_str, utsname()->release, in efa_set_host_info()
274 sizeof(hinf->os_dist_str)); in efa_set_host_info()
275 hinf->os_type = EFA_ADMIN_OS_LINUX; in efa_set_host_info()
276 strscpy(hinf->kernel_ver_str, utsname()->version, in efa_set_host_info()
277 sizeof(hinf->kernel_ver_str)); in efa_set_host_info()
278 hinf->kernel_ver = LINUX_VERSION_CODE; in efa_set_host_info()
279 EFA_SET(&hinf->driver_ver, EFA_ADMIN_HOST_INFO_DRIVER_MAJOR, 0); in efa_set_host_info()
280 EFA_SET(&hinf->driver_ver, EFA_ADMIN_HOST_INFO_DRIVER_MINOR, 0); in efa_set_host_info()
281 EFA_SET(&hinf->driver_ver, EFA_ADMIN_HOST_INFO_DRIVER_SUB_MINOR, 0); in efa_set_host_info()
282 EFA_SET(&hinf->driver_ver, EFA_ADMIN_HOST_INFO_DRIVER_MODULE_TYPE, 0); in efa_set_host_info()
283 EFA_SET(&hinf->bdf, EFA_ADMIN_HOST_INFO_BUS, dev->pdev->bus->number); in efa_set_host_info()
284 EFA_SET(&hinf->bdf, EFA_ADMIN_HOST_INFO_DEVICE, in efa_set_host_info()
285 PCI_SLOT(dev->pdev->devfn)); in efa_set_host_info()
286 EFA_SET(&hinf->bdf, EFA_ADMIN_HOST_INFO_FUNCTION, in efa_set_host_info()
287 PCI_FUNC(dev->pdev->devfn)); in efa_set_host_info()
288 EFA_SET(&hinf->spec_ver, EFA_ADMIN_HOST_INFO_SPEC_MAJOR, in efa_set_host_info()
290 EFA_SET(&hinf->spec_ver, EFA_ADMIN_HOST_INFO_SPEC_MINOR, in efa_set_host_info()
292 EFA_SET(&hinf->flags, EFA_ADMIN_HOST_INFO_INTREE, 1); in efa_set_host_info()
293 EFA_SET(&hinf->flags, EFA_ADMIN_HOST_INFO_GDR, 0); in efa_set_host_info()
295 efa_com_set_feature_ex(&dev->edev, &resp, &cmd, EFA_ADMIN_HOST_INFO, in efa_set_host_info()
298 dma_free_coherent(&dev->pdev->dev, bufsz, hinf, hinf_dma); in efa_set_host_info()
303 efa_com_eq_destroy(&dev->edev, &eq->eeq); in efa_destroy_eq()
304 efa_free_irq(dev, &eq->irq); in efa_destroy_eq()
312 err = efa_request_irq(dev, &eq->irq); in efa_create_eq()
316 err = efa_com_eq_init(&dev->edev, &eq->eeq, efa_process_eqe, in efa_create_eq()
317 dev->dev_attr.max_eq_depth, msix_vec); in efa_create_eq()
324 efa_free_irq(dev, &eq->irq); in efa_create_eq()
330 u32 neqs = dev->dev_attr.max_eq; in efa_create_eqs()
333 neqs = min_t(u32, neqs, dev->num_irq_vectors - EFA_COMP_EQS_VEC_BASE); in efa_create_eqs()
334 dev->neqs = neqs; in efa_create_eqs()
335 dev->eqs = kcalloc(neqs, sizeof(*dev->eqs), GFP_KERNEL); in efa_create_eqs()
336 if (!dev->eqs) in efa_create_eqs()
337 return -ENOMEM; in efa_create_eqs()
340 err = efa_create_eq(dev, &dev->eqs[i], i + EFA_COMP_EQS_VEC_BASE); in efa_create_eqs()
348 for (i--; i >= 0; i--) in efa_create_eqs()
349 efa_destroy_eq(dev, &dev->eqs[i]); in efa_create_eqs()
350 kfree(dev->eqs); in efa_create_eqs()
359 for (i = 0; i < dev->neqs; i++) in efa_destroy_eqs()
360 efa_destroy_eq(dev, &dev->eqs[i]); in efa_destroy_eqs()
362 kfree(dev->eqs); in efa_destroy_eqs()
407 struct pci_dev *pdev = dev->pdev; in efa_ib_device_add()
412 err = efa_com_get_device_attr(&dev->edev, &dev->dev_attr); in efa_ib_device_add()
416 dev_dbg(&dev->pdev->dev, "Doorbells bar (%d)\n", dev->dev_attr.db_bar); in efa_ib_device_add()
421 err = efa_com_get_hw_hints(&dev->edev, &hw_hints); in efa_ib_device_add()
428 err = efa_com_set_aenq_config(&dev->edev, EFA_AENQ_ENABLED_GROUPS); in efa_ib_device_add()
438 dev->ibdev.node_type = RDMA_NODE_UNSPECIFIED; in efa_ib_device_add()
439 dev->ibdev.node_guid = dev->dev_attr.guid; in efa_ib_device_add()
440 dev->ibdev.phys_port_cnt = 1; in efa_ib_device_add()
441 dev->ibdev.num_comp_vectors = dev->neqs ?: 1; in efa_ib_device_add()
442 dev->ibdev.dev.parent = &pdev->dev; in efa_ib_device_add()
444 ib_set_device_ops(&dev->ibdev, &efa_dev_ops); in efa_ib_device_add()
446 dev->ibdev.driver_def = efa_uapi_defs; in efa_ib_device_add()
448 err = ib_register_device(&dev->ibdev, "efa_%d", &pdev->dev); in efa_ib_device_add()
452 ibdev_info(&dev->ibdev, "IB device registered\n"); in efa_ib_device_add()
465 ibdev_info(&dev->ibdev, "Unregister ib device\n"); in efa_ib_device_remove()
466 ib_unregister_device(&dev->ibdev); in efa_ib_device_remove()
473 pci_free_irq_vectors(dev->pdev); in efa_disable_msix()
481 * Reserve the max msix vectors we might need, one vector is reserved in efa_enable_msix()
484 max_vecs = min_t(int, pci_msix_vec_count(dev->pdev), in efa_enable_msix()
486 dev_dbg(&dev->pdev->dev, "Trying to enable MSI-X, vectors %d\n", in efa_enable_msix()
489 dev->admin_msix_vector_idx = EFA_MGMNT_MSIX_VEC_IDX; in efa_enable_msix()
490 num_vecs = pci_alloc_irq_vectors(dev->pdev, 1, in efa_enable_msix()
494 dev_err(&dev->pdev->dev, "Failed to enable MSI-X. error %d\n", in efa_enable_msix()
496 return -ENOSPC; in efa_enable_msix()
499 dev_dbg(&dev->pdev->dev, "Allocated %d MSI-X vectors\n", num_vecs); in efa_enable_msix()
501 dev->num_irq_vectors = num_vecs; in efa_enable_msix()
525 err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(dma_width)); in efa_device_init()
527 dev_err(&pdev->dev, "dma_set_mask_and_coherent failed %d\n", err); in efa_device_init()
531 dma_set_max_seg_size(&pdev->dev, UINT_MAX); in efa_device_init()
544 dev_err(&pdev->dev, "pci_enable_device_mem() failed!\n"); in efa_probe_device()
552 dev_err(&pdev->dev, "Device alloc failed\n"); in efa_probe_device()
553 err = -ENOMEM; in efa_probe_device()
558 edev = &dev->edev; in efa_probe_device()
559 edev->efa_dev = dev; in efa_probe_device()
560 edev->dmadev = &pdev->dev; in efa_probe_device()
561 dev->pdev = pdev; in efa_probe_device()
562 xa_init(&dev->cqs_xa); in efa_probe_device()
566 dev_err(&pdev->dev, "BARs unavailable. Requested %#x, available %#x\n", in efa_probe_device()
568 err = -ENODEV; in efa_probe_device()
573 dev_err(&pdev->dev, "pci_request_selected_regions failed %d\n", in efa_probe_device()
578 dev->reg_bar_addr = pci_resource_start(pdev, EFA_REG_BAR); in efa_probe_device()
579 dev->reg_bar_len = pci_resource_len(pdev, EFA_REG_BAR); in efa_probe_device()
580 dev->mem_bar_addr = pci_resource_start(pdev, EFA_MEM_BAR); in efa_probe_device()
581 dev->mem_bar_len = pci_resource_len(pdev, EFA_MEM_BAR); in efa_probe_device()
583 edev->reg_bar = devm_ioremap(&pdev->dev, in efa_probe_device()
584 dev->reg_bar_addr, in efa_probe_device()
585 dev->reg_bar_len); in efa_probe_device()
586 if (!edev->reg_bar) { in efa_probe_device()
587 dev_err(&pdev->dev, "Failed to remap register bar\n"); in efa_probe_device()
588 err = -EFAULT; in efa_probe_device()
594 dev_err(&pdev->dev, "Failed to init readless MMIO\n"); in efa_probe_device()
600 dev_err(&pdev->dev, "EFA device init failed\n"); in efa_probe_device()
601 if (err == -ETIME) in efa_probe_device()
602 err = -EPROBE_DEFER; in efa_probe_device()
610 edev->aq.msix_vector_idx = dev->admin_msix_vector_idx; in efa_probe_device()
611 edev->aenq.msix_vector_idx = dev->admin_msix_vector_idx; in efa_probe_device()
624 efa_free_irq(dev, &dev->admin_irq); in efa_probe_device()
630 devm_iounmap(&pdev->dev, edev->reg_bar); in efa_probe_device()
634 ib_dealloc_device(&dev->ibdev); in efa_probe_device()
646 edev = &dev->edev; in efa_remove_device()
649 efa_free_irq(dev, &dev->admin_irq); in efa_remove_device()
652 devm_iounmap(&pdev->dev, edev->reg_bar); in efa_remove_device()
654 xa_destroy(&dev->cqs_xa); in efa_remove_device()
655 ib_dealloc_device(&dev->ibdev); in efa_remove_device()
692 efa_com_dev_reset(&dev->edev, EFA_REGS_RESET_SHUTDOWN); in efa_shutdown()
693 efa_free_irq(dev, &dev->admin_irq); in efa_shutdown()