Lines Matching refs:ntb

9  * Based on pci-epf-ntb.c
46 #include <linux/ntb.h>
119 struct ntb_dev ntb;
148 #define ntb_ndev(__ntb) container_of(__ntb, struct epf_ntb, ntb)
159 * @ntb: NTB device that facilitates communication between HOST and VHOST
167 static int epf_ntb_link_up(struct epf_ntb *ntb, bool link_up)
170 ntb->reg->link_status |= LINK_STATUS_UP;
172 ntb->reg->link_status &= ~LINK_STATUS_UP;
174 ntb_link_event(&ntb->ntb);
181 * @ntb: NTB device that facilitates communication between HOST and VHOST
202 static int epf_ntb_configure_mw(struct epf_ntb *ntb, u32 mw)
209 phys_addr = ntb->vpci_mw_phy[mw];
210 addr = ntb->reg->addr;
211 size = ntb->reg->size;
213 func_no = ntb->epf->func_no;
214 vfunc_no = ntb->epf->vfunc_no;
216 ret = pci_epc_map_addr(ntb->epf->epc, func_no, vfunc_no, phys_addr, addr, size);
218 dev_err(&ntb->epf->epc->dev,
225 * @ntb: NTB device that facilitates communication between HOST and VHOST
231 static void epf_ntb_teardown_mw(struct epf_ntb *ntb, u32 mw)
233 pci_epc_unmap_addr(ntb->epf->epc,
234 ntb->epf->func_no,
235 ntb->epf->vfunc_no,
236 ntb->vpci_mw_phy[mw]);
252 struct epf_ntb *ntb;
257 ntb = container_of(work, struct epf_ntb, cmd_handler.work);
259 for (i = 1; i < ntb->db_count; i++) {
260 if (ntb->epf_db[i]) {
261 ntb->db |= 1 << (i - 1);
262 ntb_db_event(&ntb->ntb, i);
263 ntb->epf_db[i] = 0;
267 ctrl = ntb->reg;
276 ctrl = ntb->reg;
277 dev = &ntb->epf->dev;
287 ret = epf_ntb_configure_mw(ntb, argument);
294 epf_ntb_teardown_mw(ntb, argument);
298 ntb->linkup = true;
299 ret = epf_ntb_link_up(ntb, true);
306 ntb->linkup = false;
307 ret = epf_ntb_link_up(ntb, false);
319 queue_delayed_work(kpcintb_workqueue, &ntb->cmd_handler,
325 * @ntb: EPC associated with one of the HOST which holds peer's outbound
340 static void epf_ntb_config_sspad_bar_clear(struct epf_ntb *ntb)
345 barno = ntb->epf_ntb_bar[BAR_CONFIG];
346 epf_bar = &ntb->epf->bar[barno];
348 pci_epc_clear_bar(ntb->epf->epc, ntb->epf->func_no, ntb->epf->vfunc_no, epf_bar);
353 * @ntb: NTB device that facilitates communication between HOST and VHOST
363 static int epf_ntb_config_sspad_bar_set(struct epf_ntb *ntb)
371 dev = &ntb->epf->dev;
372 func_no = ntb->epf->func_no;
373 vfunc_no = ntb->epf->vfunc_no;
374 barno = ntb->epf_ntb_bar[BAR_CONFIG];
375 epf_bar = &ntb->epf->bar[barno];
377 ret = pci_epc_set_bar(ntb->epf->epc, func_no, vfunc_no, epf_bar);
388 * @ntb: NTB device that facilitates communication between HOST and VHOST
390 static void epf_ntb_config_spad_bar_free(struct epf_ntb *ntb)
394 barno = ntb->epf_ntb_bar[BAR_CONFIG];
395 pci_epf_free_space(ntb->epf, ntb->reg, barno, 0);
401 * @ntb: NTB device that facilitates communication between HOST and VHOST
409 static int epf_ntb_config_spad_bar_alloc(struct epf_ntb *ntb)
416 struct pci_epf *epf = ntb->epf;
424 barno = ntb->epf_ntb_bar[BAR_CONFIG];
431 spad_count = ntb->spad_count;
455 ntb->reg = base;
457 ctrl = ntb->reg;
461 ctrl->num_mws = ntb->num_mws;
462 ntb->spad_size = spad_size;
466 for (i = 0; i < ntb->db_count; i++) {
467 ntb->reg->db_data[i] = 1 + i;
468 ntb->reg->db_offset[i] = 0;
476 * @ntb: NTB device that facilitates communication between HOST and VHOST
483 static int epf_ntb_configure_interrupt(struct epf_ntb *ntb)
490 dev = &ntb->epf->dev;
492 epc_features = pci_epc_get_features(ntb->epf->epc, ntb->epf->func_no, ntb->epf->vfunc_no);
499 db_count = ntb->db_count;
505 ntb->db_count = db_count;
508 ret = pci_epc_set_msi(ntb->epf->epc,
509 ntb->epf->func_no,
510 ntb->epf->vfunc_no,
523 * @ntb: NTB device that facilitates communication between HOST and VHOST
527 static int epf_ntb_db_bar_init(struct epf_ntb *ntb)
531 struct device *dev = &ntb->epf->dev;
536 size_t size = sizeof(u32) * ntb->db_count;
538 epc_features = pci_epc_get_features(ntb->epf->epc,
539 ntb->epf->func_no,
540 ntb->epf->vfunc_no);
551 barno = ntb->epf_ntb_bar[BAR_DB];
553 mw_addr = pci_epf_alloc_space(ntb->epf, size, barno, align, 0);
559 ntb->epf_db = mw_addr;
561 epf_bar = &ntb->epf->bar[barno];
563 ret = pci_epc_set_bar(ntb->epf->epc, ntb->epf->func_no, ntb->epf->vfunc_no, epf_bar);
571 pci_epf_free_space(ntb->epf, mw_addr, barno, 0);
575 static void epf_ntb_mw_bar_clear(struct epf_ntb *ntb, int num_mws);
580 * @ntb: NTB device that facilitates communication between HOST and VHOST
582 static void epf_ntb_db_bar_clear(struct epf_ntb *ntb)
586 barno = ntb->epf_ntb_bar[BAR_DB];
587 pci_epf_free_space(ntb->epf, ntb->epf_db, barno, 0);
588 pci_epc_clear_bar(ntb->epf->epc,
589 ntb->epf->func_no,
590 ntb->epf->vfunc_no,
591 &ntb->epf->bar[barno]);
596 * @ntb: NTB device that facilitates communication between HOST and VHOST
600 static int epf_ntb_mw_bar_init(struct epf_ntb *ntb)
606 struct device *dev = &ntb->epf->dev;
608 for (i = 0; i < ntb->num_mws; i++) {
609 size = ntb->mws_size[i];
610 barno = ntb->epf_ntb_bar[BAR_MW0 + i];
612 ntb->epf->bar[barno].barno = barno;
613 ntb->epf->bar[barno].size = size;
614 ntb->epf->bar[barno].addr = NULL;
615 ntb->epf->bar[barno].phys_addr = 0;
616 ntb->epf->bar[barno].flags |= upper_32_bits(size) ?
620 ret = pci_epc_set_bar(ntb->epf->epc,
621 ntb->epf->func_no,
622 ntb->epf->vfunc_no,
623 &ntb->epf->bar[barno]);
630 ntb->vpci_mw_addr[i] = pci_epc_mem_alloc_addr(ntb->epf->epc,
631 &ntb->vpci_mw_phy[i],
633 if (!ntb->vpci_mw_addr[i]) {
643 pci_epc_clear_bar(ntb->epf->epc,
644 ntb->epf->func_no,
645 ntb->epf->vfunc_no,
646 &ntb->epf->bar[barno]);
648 epf_ntb_mw_bar_clear(ntb, i);
654 * @ntb: NTB device that facilitates communication between HOST and VHOST
657 static void epf_ntb_mw_bar_clear(struct epf_ntb *ntb, int num_mws)
663 barno = ntb->epf_ntb_bar[BAR_MW0 + i];
664 pci_epc_clear_bar(ntb->epf->epc,
665 ntb->epf->func_no,
666 ntb->epf->vfunc_no,
667 &ntb->epf->bar[barno]);
669 pci_epc_mem_free_addr(ntb->epf->epc,
670 ntb->vpci_mw_phy[i],
671 ntb->vpci_mw_addr[i],
672 ntb->mws_size[i]);
678 * @ntb: NTB device that facilitates communication between HOST and VHOST
682 static void epf_ntb_epc_destroy(struct epf_ntb *ntb)
684 pci_epc_remove_epf(ntb->epf->epc, ntb->epf, 0);
685 pci_epc_put(ntb->epf->epc);
691 * @ntb: NTB device that facilitates communication between HOST and VHOST
695 static int epf_ntb_init_epc_bar(struct epf_ntb *ntb)
705 num_mws = ntb->num_mws;
706 dev = &ntb->epf->dev;
707 epc_features = pci_epc_get_features(ntb->epf->epc, ntb->epf->func_no, ntb->epf->vfunc_no);
716 ntb->epf_ntb_bar[bar] = barno;
723 ntb->num_mws = i;
726 ntb->epf_ntb_bar[bar] = barno;
734 * @ntb: NTB device that facilitates communication between HOST and VHOST
742 static int epf_ntb_epc_init(struct epf_ntb *ntb)
750 epf = ntb->epf;
753 func_no = ntb->epf->func_no;
754 vfunc_no = ntb->epf->vfunc_no;
756 ret = epf_ntb_config_sspad_bar_set(ntb);
762 ret = epf_ntb_configure_interrupt(ntb);
768 ret = epf_ntb_db_bar_init(ntb);
774 ret = epf_ntb_mw_bar_init(ntb);
788 INIT_DELAYED_WORK(&ntb->cmd_handler, epf_ntb_cmd_handler);
789 queue_work(kpcintb_workqueue, &ntb->cmd_handler.work);
794 epf_ntb_mw_bar_clear(ntb, ntb->num_mws);
796 epf_ntb_db_bar_clear(ntb);
799 epf_ntb_config_sspad_bar_clear(ntb);
807 * @ntb: NTB device that facilitates communication between HOST and VHOST
811 static void epf_ntb_epc_cleanup(struct epf_ntb *ntb)
813 epf_ntb_db_bar_clear(ntb);
814 epf_ntb_mw_bar_clear(ntb, ntb->num_mws);
822 struct epf_ntb *ntb = to_epf_ntb(group); \
824 return sprintf(page, "%d\n", ntb->_name); \
832 struct epf_ntb *ntb = to_epf_ntb(group); \
840 ntb->_name = val; \
850 struct epf_ntb *ntb = to_epf_ntb(group); \
851 struct device *dev = &ntb->epf->dev; \
857 if (win_no <= 0 || win_no > ntb->num_mws) { \
858 dev_err(dev, "Invalid num_nws: %d value\n", ntb->num_mws); \
862 return sprintf(page, "%lld\n", ntb->mws_size[win_no - 1]); \
870 struct epf_ntb *ntb = to_epf_ntb(group); \
871 struct device *dev = &ntb->epf->dev; \
883 if (win_no <= 0 || win_no > ntb->num_mws) { \
884 dev_err(dev, "Invalid num_nws: %d value\n", ntb->num_mws); \
888 ntb->mws_size[win_no - 1] = val; \
897 struct epf_ntb *ntb = to_epf_ntb(group);
908 ntb->num_mws = val;
977 struct epf_ntb *ntb = epf_get_drvdata(epf);
978 struct config_group *ntb_group = &ntb->group;
1042 static int vntb_epf_mw_count(struct ntb_dev *ntb, int pidx)
1044 struct epf_ntb *ndev = ntb_ndev(ntb);
1049 static int vntb_epf_spad_count(struct ntb_dev *ntb)
1051 return ntb_ndev(ntb)->spad_count;
1054 static int vntb_epf_peer_mw_count(struct ntb_dev *ntb)
1056 return ntb_ndev(ntb)->num_mws;
1059 static u64 vntb_epf_db_valid_mask(struct ntb_dev *ntb)
1061 return BIT_ULL(ntb_ndev(ntb)->db_count) - 1;
1064 static int vntb_epf_db_set_mask(struct ntb_dev *ntb, u64 db_bits)
1072 struct epf_ntb *ntb = ntb_ndev(ndev);
1078 dev = &ntb->ntb.dev;
1079 barno = ntb->epf_ntb_bar[BAR_MW0 + idx];
1080 epf_bar = &ntb->epf->bar[barno];
1085 ret = pci_epc_set_bar(ntb->epf->epc, 0, 0, epf_bar);
1093 static int vntb_epf_mw_clear_trans(struct ntb_dev *ntb, int pidx, int idx)
1102 struct epf_ntb *ntb = ntb_ndev(ndev);
1105 *base = ntb->vpci_mw_phy[idx];
1108 *size = ntb->mws_size[idx];
1113 static int vntb_epf_link_enable(struct ntb_dev *ntb,
1122 struct epf_ntb *ntb = ntb_ndev(ndev);
1123 int off = ntb->reg->spad_offset, ct = ntb->reg->spad_count * sizeof(u32);
1125 void __iomem *base = (void __iomem *)ntb->reg;
1133 struct epf_ntb *ntb = ntb_ndev(ndev);
1134 struct epf_ntb_ctrl *ctrl = ntb->reg;
1136 void __iomem *base = (void __iomem *)ntb->reg;
1144 struct epf_ntb *ntb = ntb_ndev(ndev);
1145 struct epf_ntb_ctrl *ctrl = ntb->reg;
1147 void __iomem *base = (void __iomem *)ntb->reg;
1156 struct epf_ntb *ntb = ntb_ndev(ndev);
1157 struct epf_ntb_ctrl *ctrl = ntb->reg;
1159 void __iomem *base = (void __iomem *)ntb->reg;
1168 struct epf_ntb *ntb = ntb_ndev(ndev);
1172 func_no = ntb->epf->func_no;
1173 vfunc_no = ntb->epf->vfunc_no;
1175 ret = pci_epc_raise_irq(ntb->epf->epc,
1181 dev_err(&ntb->ntb.dev, "Failed to raise IRQ\n");
1188 struct epf_ntb *ntb = ntb_ndev(ndev);
1190 return ntb->db;
1198 struct epf_ntb *ntb = ntb_ndev(ndev);
1207 *size_max = ntb->mws_size[idx];
1216 struct epf_ntb *ntb = ntb_ndev(ndev);
1218 return ntb->reg->link_status;
1228 struct epf_ntb *ntb = ntb_ndev(ndev);
1230 ntb->db &= ~db_bits;
1234 static int vntb_epf_link_disable(struct ntb_dev *ntb)
1268 ndev->ntb.pdev = pdev;
1269 ndev->ntb.topo = NTB_TOPO_NONE;
1270 ndev->ntb.ops = &vntb_epf_ops;
1278 ret = ntb_register_device(&ndev->ntb);
1316 struct epf_ntb *ntb = epf_get_drvdata(epf);
1325 ret = epf_ntb_init_epc_bar(ntb);
1331 ret = epf_ntb_config_spad_bar_alloc(ntb);
1337 ret = epf_ntb_epc_init(ntb);
1343 epf_set_drvdata(epf, ntb);
1345 pci_space[0] = (ntb->vntb_pid << 16) | ntb->vntb_vid;
1346 pci_vntb_table[0].vendor = ntb->vntb_vid;
1347 pci_vntb_table[0].device = ntb->vntb_pid;
1355 vpci_scan_bus(ntb);
1360 epf_ntb_config_spad_bar_free(ntb);
1363 epf_ntb_epc_destroy(ntb);
1376 struct epf_ntb *ntb = epf_get_drvdata(epf);
1378 epf_ntb_epc_cleanup(ntb);
1379 epf_ntb_config_spad_bar_free(ntb);
1380 epf_ntb_epc_destroy(ntb);
1405 struct epf_ntb *ntb;
1410 ntb = devm_kzalloc(dev, sizeof(*ntb), GFP_KERNEL);
1411 if (!ntb)
1415 ntb->epf = epf;
1416 ntb->vbus_number = 0xff;
1417 epf_set_drvdata(epf, ntb);
1447 pr_err("Failed to register pci epf ntb driver --> %d\n", ret);