Lines Matching refs:pf

39  * @pf:       NFP PF handle
47 nfp_net_get_mac_addr(struct nfp_pf *pf, struct net_device *netdev,
74 static int nfp_net_pf_get_num_ports(struct nfp_pf *pf)
76 return nfp_pf_rtsym_read_optional(pf, "nfd_cfg_pf%u_num_ports", 1);
79 static void nfp_net_pf_free_vnic(struct nfp_pf *pf, struct nfp_net *nn)
82 nfp_app_vnic_free(pf->app, nn);
85 pf->num_vnics--;
89 static void nfp_net_pf_free_vnics(struct nfp_pf *pf)
93 list_for_each_entry_safe(nn, next, &pf->vnics, vnic_list)
95 nfp_net_pf_free_vnic(pf, nn);
99 nfp_net_pf_alloc_vnic(struct nfp_pf *pf, bool needs_netdev,
113 nn = nfp_net_alloc(pf->pdev, pf->dev_info, ctrl_bar, needs_netdev,
118 nn->app = pf->app;
126 err = nfp_app_vnic_alloc(pf->app, nn, id);
133 pf->num_vnics++;
134 list_add_tail(&nn->vnic_list, &pf->vnics);
140 nfp_net_pf_init_vnic(struct nfp_pf *pf, struct nfp_net *nn, unsigned int id)
147 err = nfp_devlink_port_register(pf->app, nn->port);
156 nfp_net_debugfs_vnic_add(nn, pf->ddir);
161 err = nfp_app_vnic_init(pf->app, nn);
178 nfp_net_pf_alloc_vnics(struct nfp_pf *pf, void __iomem *ctrl_bar,
185 for (i = 0; i < pf->max_data_vnics; i++) {
186 nn = nfp_net_pf_alloc_vnic(pf, true, ctrl_bar, qc_bar,
200 nfp_net_pf_free_vnic(pf, nn);
203 if (list_empty(&pf->vnics))
209 nfp_net_pf_free_vnics(pf);
213 static void nfp_net_pf_clean_vnic(struct nfp_pf *pf, struct nfp_net *nn)
216 nfp_app_vnic_clean(pf->app, nn);
223 static int nfp_net_pf_alloc_irqs(struct nfp_pf *pf)
230 list_for_each_entry(nn, &pf->vnics, vnic_list)
232 pf->irq_entries = kcalloc(wanted_irqs, sizeof(*pf->irq_entries),
234 if (!pf->irq_entries)
237 num_irqs = nfp_net_irqs_alloc(pf->pdev, pf->irq_entries,
238 NFP_NET_MIN_VNIC_IRQS * pf->num_vnics,
241 nfp_warn(pf->cpp, "Unable to allocate MSI-X vectors\n");
242 kfree(pf->irq_entries);
248 vnics_left = pf->num_vnics;
249 list_for_each_entry(nn, &pf->vnics, vnic_list) {
254 nfp_net_irqs_assign(nn, &pf->irq_entries[num_irqs - irqs_left],
263 static void nfp_net_pf_free_irqs(struct nfp_pf *pf)
265 nfp_net_irqs_disable(pf->pdev);
266 kfree(pf->irq_entries);
269 static int nfp_net_pf_init_vnics(struct nfp_pf *pf)
277 list_for_each_entry(nn, &pf->vnics, vnic_list) {
280 err = nfp_net_pf_init_vnic(pf, nn, id);
290 list_for_each_entry_continue_reverse(nn, &pf->vnics, vnic_list)
292 nfp_net_pf_clean_vnic(pf, nn);
297 nfp_net_pf_app_init(struct nfp_pf *pf, u8 __iomem *qc_bar, unsigned int stride)
299 struct devlink *devlink = priv_to_devlink(pf);
303 pf->app = nfp_app_alloc(pf, nfp_net_pf_get_app_id(pf));
304 if (IS_ERR(pf->app))
305 return PTR_ERR(pf->app);
308 err = nfp_app_init(pf->app);
313 if (!nfp_app_needs_ctrl_vnic(pf->app))
316 ctrl_bar = nfp_pf_map_rtsym(pf, "net.ctrl", "_pf%u_net_ctrl_bar",
317 NFP_PF_CSR_SLICE_SIZE, &pf->ctrl_vnic_bar);
319 nfp_err(pf->cpp, "Failed to find ctrl vNIC memory symbol\n");
324 pf->ctrl_vnic = nfp_net_pf_alloc_vnic(pf, false, ctrl_bar, qc_bar,
326 if (IS_ERR(pf->ctrl_vnic)) {
327 err = PTR_ERR(pf->ctrl_vnic);
334 nfp_cpp_area_release_free(pf->ctrl_vnic_bar);
337 nfp_app_clean(pf->app);
340 nfp_app_free(pf->app);
341 pf->app = NULL;
345 static void nfp_net_pf_app_clean(struct nfp_pf *pf)
347 struct devlink *devlink = priv_to_devlink(pf);
349 if (pf->ctrl_vnic) {
350 nfp_net_pf_free_vnic(pf, pf->ctrl_vnic);
351 nfp_cpp_area_release_free(pf->ctrl_vnic_bar);
355 nfp_app_clean(pf->app);
358 nfp_app_free(pf->app);
359 pf->app = NULL;
362 static int nfp_net_pf_app_start_ctrl(struct nfp_pf *pf)
366 if (!pf->ctrl_vnic)
368 err = nfp_net_pf_init_vnic(pf, pf->ctrl_vnic, 0);
372 err = nfp_ctrl_open(pf->ctrl_vnic);
379 nfp_net_pf_clean_vnic(pf, pf->ctrl_vnic);
383 static void nfp_net_pf_app_stop_ctrl(struct nfp_pf *pf)
385 if (!pf->ctrl_vnic)
387 nfp_ctrl_close(pf->ctrl_vnic);
388 nfp_net_pf_clean_vnic(pf, pf->ctrl_vnic);
391 static int nfp_net_pf_app_start(struct nfp_pf *pf)
395 err = nfp_net_pf_app_start_ctrl(pf);
399 err = nfp_app_start(pf->app, pf->ctrl_vnic);
403 if (pf->num_vfs) {
404 err = nfp_app_sriov_enable(pf->app, pf->num_vfs);
412 nfp_app_stop(pf->app);
414 nfp_net_pf_app_stop_ctrl(pf);
418 static void nfp_net_pf_app_stop(struct nfp_pf *pf)
420 if (pf->num_vfs)
421 nfp_app_sriov_disable(pf->app);
422 nfp_app_stop(pf->app);
423 nfp_net_pf_app_stop_ctrl(pf);
426 static void nfp_net_pci_unmap_mem(struct nfp_pf *pf)
428 if (pf->vfcfg_tbl2_area)
429 nfp_cpp_area_release_free(pf->vfcfg_tbl2_area);
430 if (pf->vf_cfg_bar)
431 nfp_cpp_area_release_free(pf->vf_cfg_bar);
432 if (pf->mac_stats_bar)
433 nfp_cpp_area_release_free(pf->mac_stats_bar);
434 nfp_cpp_area_release_free(pf->qc_area);
435 nfp_cpp_area_release_free(pf->data_vnic_bar);
438 static int nfp_net_pci_map_mem(struct nfp_pf *pf)
444 min_size = pf->max_data_vnics * NFP_PF_CSR_SLICE_SIZE;
445 mem = nfp_pf_map_rtsym(pf, "net.bar0", "_pf%d_net_bar0",
446 min_size, &pf->data_vnic_bar);
448 nfp_err(pf->cpp, "Failed to find data vNIC memory symbol\n");
452 if (pf->eth_tbl) {
453 min_size = NFP_MAC_STATS_SIZE * (pf->eth_tbl->max_index + 1);
454 pf->mac_stats_mem = nfp_rtsym_map(pf->rtbl, "_mac_stats",
456 &pf->mac_stats_bar);
457 if (IS_ERR(pf->mac_stats_mem)) {
458 if (PTR_ERR(pf->mac_stats_mem) != -ENOENT) {
459 err = PTR_ERR(pf->mac_stats_mem);
462 pf->mac_stats_mem = NULL;
466 pf->vf_cfg_mem = nfp_pf_map_rtsym(pf, "net.vfcfg", "_pf%d_net_vf_bar",
467 NFP_NET_CFG_BAR_SZ * pf->limit_vfs,
468 &pf->vf_cfg_bar);
469 if (IS_ERR(pf->vf_cfg_mem)) {
470 if (PTR_ERR(pf->vf_cfg_mem) != -ENOENT) {
471 err = PTR_ERR(pf->vf_cfg_mem);
474 pf->vf_cfg_mem = NULL;
477 min_size = NFP_NET_VF_CFG_SZ * pf->limit_vfs + NFP_NET_VF_CFG_MB_SZ;
478 pf->vfcfg_tbl2 = nfp_pf_map_rtsym(pf, "net.vfcfg_tbl2",
480 min_size, &pf->vfcfg_tbl2_area);
481 if (IS_ERR(pf->vfcfg_tbl2)) {
482 if (PTR_ERR(pf->vfcfg_tbl2) != -ENOENT) {
483 err = PTR_ERR(pf->vfcfg_tbl2);
486 pf->vfcfg_tbl2 = NULL;
490 mem = nfp_cpp_map_area(pf->cpp, "net.qc", cpp_id,
491 nfp_qcp_queue_offset(pf->dev_info, 0),
492 pf->dev_info->qc_area_sz, &pf->qc_area);
494 nfp_err(pf->cpp, "Failed to map Queue Controller area.\n");
502 if (pf->vfcfg_tbl2_area)
503 nfp_cpp_area_release_free(pf->vfcfg_tbl2_area);
505 if (pf->vf_cfg_bar)
506 nfp_cpp_area_release_free(pf->vf_cfg_bar);
508 if (pf->mac_stats_bar)
509 nfp_cpp_area_release_free(pf->mac_stats_bar);
511 nfp_cpp_area_release_free(pf->data_vnic_bar);
592 int nfp_net_refresh_port_table_sync(struct nfp_pf *pf)
594 struct devlink *devlink = priv_to_devlink(pf);
603 if (list_empty(&pf->vnics))
608 list_for_each_entry(port, &pf->ports, port_list)
611 eth_table = nfp_eth_read_ports(pf->cpp);
613 list_for_each_entry(port, &pf->ports, port_list)
617 nfp_err(pf->cpp, "Error refreshing port config!\n");
621 list_for_each_entry(port, &pf->ports, port_list)
623 nfp_net_eth_port_update(pf->cpp, port, eth_table);
629 err = nfp_reprs_resync_phys_ports(pf->app);
634 list_for_each_entry_safe(nn, next, &pf->vnics, vnic_list) {
638 nfp_net_pf_clean_vnic(pf, nn);
639 nfp_net_pf_free_vnic(pf, nn);
647 struct nfp_pf *pf = container_of(work, struct nfp_pf,
649 struct devlink *devlink = priv_to_devlink(pf);
652 nfp_net_refresh_port_table_sync(pf);
658 struct nfp_pf *pf = port->app->pf;
662 queue_work(pf->wq, &pf->port_refresh_work);
690 int nfp_net_pci_probe(struct nfp_pf *pf)
692 struct devlink *devlink = priv_to_devlink(pf);
698 INIT_WORK(&pf->port_refresh_work, nfp_net_refresh_vnics);
700 if (!pf->rtbl) {
701 nfp_err(pf->cpp, "No %s, giving up.\n",
702 pf->fw_loaded ? "symbol table" : "firmware found");
706 pf->max_data_vnics = nfp_net_pf_get_num_ports(pf);
707 if ((int)pf->max_data_vnics < 0)
708 return pf->max_data_vnics;
710 err = nfp_net_pci_map_mem(pf);
714 ctrl_bar = nfp_cpp_area_iomem(pf->data_vnic_bar);
715 qc_bar = nfp_cpp_area_iomem(pf->qc_area);
724 nfp_err(pf->cpp, "Unknown Firmware ABI %d.%d.%d.%d\n",
734 nfp_warn(pf->cpp, "OBSOLETE Firmware detected - VF isolation not available\n");
741 nfp_err(pf->cpp, "Unsupported Firmware ABI %d.%d.%d.%d\n",
749 err = nfp_net_pf_app_init(pf, qc_bar, stride);
753 err = nfp_shared_buf_register(pf);
758 err = nfp_devlink_params_register(pf);
762 pf->ddir = nfp_net_debugfs_device_add(pf->pdev);
765 err = nfp_net_pf_alloc_vnics(pf, ctrl_bar, qc_bar, stride);
769 err = nfp_net_pf_alloc_irqs(pf);
773 err = nfp_net_pf_app_start(pf);
777 err = nfp_net_pf_init_vnics(pf);
787 nfp_net_pf_app_stop(pf);
789 nfp_net_pf_free_irqs(pf);
791 nfp_net_pf_free_vnics(pf);
793 nfp_net_debugfs_dir_clean(&pf->ddir);
794 nfp_devlink_params_unregister(pf);
797 nfp_shared_buf_unregister(pf);
799 cancel_work_sync(&pf->port_refresh_work);
800 nfp_net_pf_app_clean(pf);
802 nfp_net_pci_unmap_mem(pf);
806 void nfp_net_pci_remove(struct nfp_pf *pf)
808 struct devlink *devlink = priv_to_devlink(pf);
811 devlink_unregister(priv_to_devlink(pf));
813 list_for_each_entry_safe(nn, next, &pf->vnics, vnic_list) {
816 nfp_net_pf_clean_vnic(pf, nn);
817 nfp_net_pf_free_vnic(pf, nn);
820 nfp_net_pf_app_stop(pf);
822 nfp_net_debugfs_dir_clean(&pf->ddir);
824 nfp_devlink_params_unregister(pf);
828 nfp_shared_buf_unregister(pf);
830 nfp_net_pf_free_irqs(pf);
831 nfp_net_pf_app_clean(pf);
832 nfp_net_pci_unmap_mem(pf);
834 cancel_work_sync(&pf->port_refresh_work);