Lines Matching refs:ntb

121 	struct ntb_dev ntb;  member
150 #define ntb_ndev(__ntb) container_of(__ntb, struct epf_ntb, ntb)
169 static int epf_ntb_link_up(struct epf_ntb *ntb, bool link_up) in epf_ntb_link_up() argument
172 ntb->reg->link_status |= LINK_STATUS_UP; in epf_ntb_link_up()
174 ntb->reg->link_status &= ~LINK_STATUS_UP; in epf_ntb_link_up()
176 ntb_link_event(&ntb->ntb); in epf_ntb_link_up()
204 static int epf_ntb_configure_mw(struct epf_ntb *ntb, u32 mw) in epf_ntb_configure_mw() argument
211 phys_addr = ntb->vpci_mw_phy[mw]; in epf_ntb_configure_mw()
212 addr = ntb->reg->addr; in epf_ntb_configure_mw()
213 size = ntb->reg->size; in epf_ntb_configure_mw()
215 func_no = ntb->epf->func_no; in epf_ntb_configure_mw()
216 vfunc_no = ntb->epf->vfunc_no; in epf_ntb_configure_mw()
218 ret = pci_epc_map_addr(ntb->epf->epc, func_no, vfunc_no, phys_addr, addr, size); in epf_ntb_configure_mw()
220 dev_err(&ntb->epf->epc->dev, in epf_ntb_configure_mw()
233 static void epf_ntb_teardown_mw(struct epf_ntb *ntb, u32 mw) in epf_ntb_teardown_mw() argument
235 pci_epc_unmap_addr(ntb->epf->epc, in epf_ntb_teardown_mw()
236 ntb->epf->func_no, in epf_ntb_teardown_mw()
237 ntb->epf->vfunc_no, in epf_ntb_teardown_mw()
238 ntb->vpci_mw_phy[mw]); in epf_ntb_teardown_mw()
254 struct epf_ntb *ntb; in epf_ntb_cmd_handler() local
259 ntb = container_of(work, struct epf_ntb, cmd_handler.work); in epf_ntb_cmd_handler()
261 for (i = 1; i < ntb->db_count; i++) { in epf_ntb_cmd_handler()
262 if (ntb->epf_db[i]) { in epf_ntb_cmd_handler()
263 ntb->db |= 1 << (i - 1); in epf_ntb_cmd_handler()
264 ntb_db_event(&ntb->ntb, i); in epf_ntb_cmd_handler()
265 ntb->epf_db[i] = 0; in epf_ntb_cmd_handler()
269 ctrl = ntb->reg; in epf_ntb_cmd_handler()
278 ctrl = ntb->reg; in epf_ntb_cmd_handler()
279 dev = &ntb->epf->dev; in epf_ntb_cmd_handler()
289 ret = epf_ntb_configure_mw(ntb, argument); in epf_ntb_cmd_handler()
296 epf_ntb_teardown_mw(ntb, argument); in epf_ntb_cmd_handler()
300 ntb->linkup = true; in epf_ntb_cmd_handler()
301 ret = epf_ntb_link_up(ntb, true); in epf_ntb_cmd_handler()
308 ntb->linkup = false; in epf_ntb_cmd_handler()
309 ret = epf_ntb_link_up(ntb, false); in epf_ntb_cmd_handler()
321 queue_delayed_work(kpcintb_workqueue, &ntb->cmd_handler, in epf_ntb_cmd_handler()
342 static void epf_ntb_config_sspad_bar_clear(struct epf_ntb *ntb) in epf_ntb_config_sspad_bar_clear() argument
347 barno = ntb->epf_ntb_bar[BAR_CONFIG]; in epf_ntb_config_sspad_bar_clear()
348 epf_bar = &ntb->epf->bar[barno]; in epf_ntb_config_sspad_bar_clear()
350 pci_epc_clear_bar(ntb->epf->epc, ntb->epf->func_no, ntb->epf->vfunc_no, epf_bar); in epf_ntb_config_sspad_bar_clear()
365 static int epf_ntb_config_sspad_bar_set(struct epf_ntb *ntb) in epf_ntb_config_sspad_bar_set() argument
373 dev = &ntb->epf->dev; in epf_ntb_config_sspad_bar_set()
374 func_no = ntb->epf->func_no; in epf_ntb_config_sspad_bar_set()
375 vfunc_no = ntb->epf->vfunc_no; in epf_ntb_config_sspad_bar_set()
376 barno = ntb->epf_ntb_bar[BAR_CONFIG]; in epf_ntb_config_sspad_bar_set()
377 epf_bar = &ntb->epf->bar[barno]; in epf_ntb_config_sspad_bar_set()
379 ret = pci_epc_set_bar(ntb->epf->epc, func_no, vfunc_no, epf_bar); in epf_ntb_config_sspad_bar_set()
392 static void epf_ntb_config_spad_bar_free(struct epf_ntb *ntb) in epf_ntb_config_spad_bar_free() argument
396 barno = ntb->epf_ntb_bar[BAR_CONFIG]; in epf_ntb_config_spad_bar_free()
397 pci_epf_free_space(ntb->epf, ntb->reg, barno, 0); in epf_ntb_config_spad_bar_free()
411 static int epf_ntb_config_spad_bar_alloc(struct epf_ntb *ntb) in epf_ntb_config_spad_bar_alloc() argument
416 struct pci_epf *epf = ntb->epf; in epf_ntb_config_spad_bar_alloc()
424 barno = ntb->epf_ntb_bar[BAR_CONFIG]; in epf_ntb_config_spad_bar_alloc()
425 spad_count = ntb->spad_count; in epf_ntb_config_spad_bar_alloc()
437 ntb->reg = base; in epf_ntb_config_spad_bar_alloc()
439 ctrl = ntb->reg; in epf_ntb_config_spad_bar_alloc()
443 ctrl->num_mws = ntb->num_mws; in epf_ntb_config_spad_bar_alloc()
444 ntb->spad_size = spad_size; in epf_ntb_config_spad_bar_alloc()
448 for (i = 0; i < ntb->db_count; i++) { in epf_ntb_config_spad_bar_alloc()
449 ntb->reg->db_data[i] = 1 + i; in epf_ntb_config_spad_bar_alloc()
450 ntb->reg->db_offset[i] = 0; in epf_ntb_config_spad_bar_alloc()
465 static int epf_ntb_configure_interrupt(struct epf_ntb *ntb) in epf_ntb_configure_interrupt() argument
472 dev = &ntb->epf->dev; in epf_ntb_configure_interrupt()
474 epc_features = pci_epc_get_features(ntb->epf->epc, ntb->epf->func_no, ntb->epf->vfunc_no); in epf_ntb_configure_interrupt()
481 db_count = ntb->db_count; in epf_ntb_configure_interrupt()
487 ntb->db_count = db_count; in epf_ntb_configure_interrupt()
490 ret = pci_epc_set_msi(ntb->epf->epc, in epf_ntb_configure_interrupt()
491 ntb->epf->func_no, in epf_ntb_configure_interrupt()
492 ntb->epf->vfunc_no, in epf_ntb_configure_interrupt()
509 static int epf_ntb_db_bar_init(struct epf_ntb *ntb) in epf_ntb_db_bar_init() argument
512 struct device *dev = &ntb->epf->dev; in epf_ntb_db_bar_init()
517 size_t size = sizeof(u32) * ntb->db_count; in epf_ntb_db_bar_init()
519 epc_features = pci_epc_get_features(ntb->epf->epc, in epf_ntb_db_bar_init()
520 ntb->epf->func_no, in epf_ntb_db_bar_init()
521 ntb->epf->vfunc_no); in epf_ntb_db_bar_init()
522 barno = ntb->epf_ntb_bar[BAR_DB]; in epf_ntb_db_bar_init()
524 mw_addr = pci_epf_alloc_space(ntb->epf, size, barno, epc_features, 0); in epf_ntb_db_bar_init()
530 ntb->epf_db = mw_addr; in epf_ntb_db_bar_init()
532 epf_bar = &ntb->epf->bar[barno]; in epf_ntb_db_bar_init()
534 ret = pci_epc_set_bar(ntb->epf->epc, ntb->epf->func_no, ntb->epf->vfunc_no, epf_bar); in epf_ntb_db_bar_init()
542 pci_epf_free_space(ntb->epf, mw_addr, barno, 0); in epf_ntb_db_bar_init()
546 static void epf_ntb_mw_bar_clear(struct epf_ntb *ntb, int num_mws);
553 static void epf_ntb_db_bar_clear(struct epf_ntb *ntb) in epf_ntb_db_bar_clear() argument
557 barno = ntb->epf_ntb_bar[BAR_DB]; in epf_ntb_db_bar_clear()
558 pci_epf_free_space(ntb->epf, ntb->epf_db, barno, 0); in epf_ntb_db_bar_clear()
559 pci_epc_clear_bar(ntb->epf->epc, in epf_ntb_db_bar_clear()
560 ntb->epf->func_no, in epf_ntb_db_bar_clear()
561 ntb->epf->vfunc_no, in epf_ntb_db_bar_clear()
562 &ntb->epf->bar[barno]); in epf_ntb_db_bar_clear()
571 static int epf_ntb_mw_bar_init(struct epf_ntb *ntb) in epf_ntb_mw_bar_init() argument
577 struct device *dev = &ntb->epf->dev; in epf_ntb_mw_bar_init()
579 for (i = 0; i < ntb->num_mws; i++) { in epf_ntb_mw_bar_init()
580 size = ntb->mws_size[i]; in epf_ntb_mw_bar_init()
581 barno = ntb->epf_ntb_bar[BAR_MW1 + i]; in epf_ntb_mw_bar_init()
583 ntb->epf->bar[barno].barno = barno; in epf_ntb_mw_bar_init()
584 ntb->epf->bar[barno].size = size; in epf_ntb_mw_bar_init()
585 ntb->epf->bar[barno].addr = NULL; in epf_ntb_mw_bar_init()
586 ntb->epf->bar[barno].phys_addr = 0; in epf_ntb_mw_bar_init()
587 ntb->epf->bar[barno].flags |= upper_32_bits(size) ? in epf_ntb_mw_bar_init()
591 ret = pci_epc_set_bar(ntb->epf->epc, in epf_ntb_mw_bar_init()
592 ntb->epf->func_no, in epf_ntb_mw_bar_init()
593 ntb->epf->vfunc_no, in epf_ntb_mw_bar_init()
594 &ntb->epf->bar[barno]); in epf_ntb_mw_bar_init()
601 ntb->vpci_mw_addr[i] = pci_epc_mem_alloc_addr(ntb->epf->epc, in epf_ntb_mw_bar_init()
602 &ntb->vpci_mw_phy[i], in epf_ntb_mw_bar_init()
604 if (!ntb->vpci_mw_addr[i]) { in epf_ntb_mw_bar_init()
614 pci_epc_clear_bar(ntb->epf->epc, in epf_ntb_mw_bar_init()
615 ntb->epf->func_no, in epf_ntb_mw_bar_init()
616 ntb->epf->vfunc_no, in epf_ntb_mw_bar_init()
617 &ntb->epf->bar[barno]); in epf_ntb_mw_bar_init()
619 epf_ntb_mw_bar_clear(ntb, i); in epf_ntb_mw_bar_init()
628 static void epf_ntb_mw_bar_clear(struct epf_ntb *ntb, int num_mws) in epf_ntb_mw_bar_clear() argument
634 barno = ntb->epf_ntb_bar[BAR_MW1 + i]; in epf_ntb_mw_bar_clear()
635 pci_epc_clear_bar(ntb->epf->epc, in epf_ntb_mw_bar_clear()
636 ntb->epf->func_no, in epf_ntb_mw_bar_clear()
637 ntb->epf->vfunc_no, in epf_ntb_mw_bar_clear()
638 &ntb->epf->bar[barno]); in epf_ntb_mw_bar_clear()
640 pci_epc_mem_free_addr(ntb->epf->epc, in epf_ntb_mw_bar_clear()
641 ntb->vpci_mw_phy[i], in epf_ntb_mw_bar_clear()
642 ntb->vpci_mw_addr[i], in epf_ntb_mw_bar_clear()
643 ntb->mws_size[i]); in epf_ntb_mw_bar_clear()
653 static void epf_ntb_epc_destroy(struct epf_ntb *ntb) in epf_ntb_epc_destroy() argument
655 pci_epc_remove_epf(ntb->epf->epc, ntb->epf, 0); in epf_ntb_epc_destroy()
656 pci_epc_put(ntb->epf->epc); in epf_ntb_epc_destroy()
667 static bool epf_ntb_is_bar_used(struct epf_ntb *ntb, in epf_ntb_is_bar_used() argument
673 if (ntb->epf_ntb_bar[i] == barno) in epf_ntb_is_bar_used()
693 static int epf_ntb_find_bar(struct epf_ntb *ntb, in epf_ntb_find_bar() argument
698 while (ntb->epf_ntb_bar[bar] < 0) { in epf_ntb_find_bar()
707 if (!epf_ntb_is_bar_used(ntb, barno)) in epf_ntb_find_bar()
708 ntb->epf_ntb_bar[bar] = barno; in epf_ntb_find_bar()
723 static int epf_ntb_init_epc_bar(struct epf_ntb *ntb) in epf_ntb_init_epc_bar() argument
733 num_mws = ntb->num_mws; in epf_ntb_init_epc_bar()
734 dev = &ntb->epf->dev; in epf_ntb_init_epc_bar()
735 epc_features = pci_epc_get_features(ntb->epf->epc, ntb->epf->func_no, ntb->epf->vfunc_no); in epf_ntb_init_epc_bar()
739 barno = epf_ntb_find_bar(ntb, epc_features, bar, barno); in epf_ntb_init_epc_bar()
748 barno = epf_ntb_find_bar(ntb, epc_features, bar, barno); in epf_ntb_init_epc_bar()
750 ntb->num_mws = i; in epf_ntb_init_epc_bar()
768 static int epf_ntb_epc_init(struct epf_ntb *ntb) in epf_ntb_epc_init() argument
776 epf = ntb->epf; in epf_ntb_epc_init()
779 func_no = ntb->epf->func_no; in epf_ntb_epc_init()
780 vfunc_no = ntb->epf->vfunc_no; in epf_ntb_epc_init()
782 ret = epf_ntb_config_sspad_bar_set(ntb); in epf_ntb_epc_init()
788 ret = epf_ntb_configure_interrupt(ntb); in epf_ntb_epc_init()
794 ret = epf_ntb_db_bar_init(ntb); in epf_ntb_epc_init()
800 ret = epf_ntb_mw_bar_init(ntb); in epf_ntb_epc_init()
814 INIT_DELAYED_WORK(&ntb->cmd_handler, epf_ntb_cmd_handler); in epf_ntb_epc_init()
815 queue_work(kpcintb_workqueue, &ntb->cmd_handler.work); in epf_ntb_epc_init()
820 epf_ntb_mw_bar_clear(ntb, ntb->num_mws); in epf_ntb_epc_init()
822 epf_ntb_db_bar_clear(ntb); in epf_ntb_epc_init()
825 epf_ntb_config_sspad_bar_clear(ntb); in epf_ntb_epc_init()
837 static void epf_ntb_epc_cleanup(struct epf_ntb *ntb) in epf_ntb_epc_cleanup() argument
839 epf_ntb_mw_bar_clear(ntb, ntb->num_mws); in epf_ntb_epc_cleanup()
840 epf_ntb_db_bar_clear(ntb); in epf_ntb_epc_cleanup()
841 epf_ntb_config_sspad_bar_clear(ntb); in epf_ntb_epc_cleanup()
849 struct epf_ntb *ntb = to_epf_ntb(group); \
851 return sprintf(page, "%d\n", ntb->_name); \
859 struct epf_ntb *ntb = to_epf_ntb(group); \
867 ntb->_name = val; \
877 struct epf_ntb *ntb = to_epf_ntb(group); \
878 struct device *dev = &ntb->epf->dev; \
884 if (win_no <= 0 || win_no > ntb->num_mws) { \
885 dev_err(dev, "Invalid num_nws: %d value\n", ntb->num_mws); \
889 return sprintf(page, "%lld\n", ntb->mws_size[win_no - 1]); \
897 struct epf_ntb *ntb = to_epf_ntb(group); \
898 struct device *dev = &ntb->epf->dev; \
910 if (win_no <= 0 || win_no > ntb->num_mws) { \
911 dev_err(dev, "Invalid num_nws: %d value\n", ntb->num_mws); \
915 ntb->mws_size[win_no - 1] = val; \
925 struct epf_ntb *ntb = to_epf_ntb(group); \
927 return sprintf(page, "%d\n", ntb->epf_ntb_bar[_id]); \
935 struct epf_ntb *ntb = to_epf_ntb(group); \
946 ntb->epf_ntb_bar[_id] = val; \
955 struct epf_ntb *ntb = to_epf_ntb(group); in epf_ntb_num_mws_store() local
966 ntb->num_mws = val; in epf_ntb_num_mws_store()
1059 struct epf_ntb *ntb = epf_get_drvdata(epf); in epf_ntb_add_cfs() local
1060 struct config_group *ntb_group = &ntb->group; in epf_ntb_add_cfs()
1126 static int vntb_epf_mw_count(struct ntb_dev *ntb, int pidx) in vntb_epf_mw_count() argument
1128 struct epf_ntb *ndev = ntb_ndev(ntb); in vntb_epf_mw_count()
1133 static int vntb_epf_spad_count(struct ntb_dev *ntb) in vntb_epf_spad_count() argument
1135 return ntb_ndev(ntb)->spad_count; in vntb_epf_spad_count()
1138 static int vntb_epf_peer_mw_count(struct ntb_dev *ntb) in vntb_epf_peer_mw_count() argument
1140 return ntb_ndev(ntb)->num_mws; in vntb_epf_peer_mw_count()
1143 static u64 vntb_epf_db_valid_mask(struct ntb_dev *ntb) in vntb_epf_db_valid_mask() argument
1145 return BIT_ULL(ntb_ndev(ntb)->db_count) - 1; in vntb_epf_db_valid_mask()
1148 static int vntb_epf_db_set_mask(struct ntb_dev *ntb, u64 db_bits) in vntb_epf_db_set_mask() argument
1156 struct epf_ntb *ntb = ntb_ndev(ndev); in vntb_epf_mw_set_trans() local
1162 dev = &ntb->ntb.dev; in vntb_epf_mw_set_trans()
1163 barno = ntb->epf_ntb_bar[BAR_MW1 + idx]; in vntb_epf_mw_set_trans()
1164 epf_bar = &ntb->epf->bar[barno]; in vntb_epf_mw_set_trans()
1169 ret = pci_epc_set_bar(ntb->epf->epc, 0, 0, epf_bar); in vntb_epf_mw_set_trans()
1177 static int vntb_epf_mw_clear_trans(struct ntb_dev *ntb, int pidx, int idx) in vntb_epf_mw_clear_trans() argument
1186 struct epf_ntb *ntb = ntb_ndev(ndev); in vntb_epf_peer_mw_get_addr() local
1189 *base = ntb->vpci_mw_phy[idx]; in vntb_epf_peer_mw_get_addr()
1192 *size = ntb->mws_size[idx]; in vntb_epf_peer_mw_get_addr()
1197 static int vntb_epf_link_enable(struct ntb_dev *ntb, in vntb_epf_link_enable() argument
1206 struct epf_ntb *ntb = ntb_ndev(ndev); in vntb_epf_spad_read() local
1207 int off = ntb->reg->spad_offset, ct = ntb->reg->spad_count * sizeof(u32); in vntb_epf_spad_read()
1209 void __iomem *base = (void __iomem *)ntb->reg; in vntb_epf_spad_read()
1217 struct epf_ntb *ntb = ntb_ndev(ndev); in vntb_epf_spad_write() local
1218 struct epf_ntb_ctrl *ctrl = ntb->reg; in vntb_epf_spad_write()
1220 void __iomem *base = (void __iomem *)ntb->reg; in vntb_epf_spad_write()
1228 struct epf_ntb *ntb = ntb_ndev(ndev); in vntb_epf_peer_spad_read() local
1229 struct epf_ntb_ctrl *ctrl = ntb->reg; in vntb_epf_peer_spad_read()
1231 void __iomem *base = (void __iomem *)ntb->reg; in vntb_epf_peer_spad_read()
1240 struct epf_ntb *ntb = ntb_ndev(ndev); in vntb_epf_peer_spad_write() local
1241 struct epf_ntb_ctrl *ctrl = ntb->reg; in vntb_epf_peer_spad_write()
1243 void __iomem *base = (void __iomem *)ntb->reg; in vntb_epf_peer_spad_write()
1252 struct epf_ntb *ntb = ntb_ndev(ndev); in vntb_epf_peer_db_set() local
1256 func_no = ntb->epf->func_no; in vntb_epf_peer_db_set()
1257 vfunc_no = ntb->epf->vfunc_no; in vntb_epf_peer_db_set()
1259 ret = pci_epc_raise_irq(ntb->epf->epc, func_no, vfunc_no, in vntb_epf_peer_db_set()
1262 dev_err(&ntb->ntb.dev, "Failed to raise IRQ\n"); in vntb_epf_peer_db_set()
1269 struct epf_ntb *ntb = ntb_ndev(ndev); in vntb_epf_db_read() local
1271 return ntb->db; in vntb_epf_db_read()
1279 struct epf_ntb *ntb = ntb_ndev(ndev); in vntb_epf_mw_get_align() local
1288 *size_max = ntb->mws_size[idx]; in vntb_epf_mw_get_align()
1297 struct epf_ntb *ntb = ntb_ndev(ndev); in vntb_epf_link_is_up() local
1299 return ntb->reg->link_status; in vntb_epf_link_is_up()
1309 struct epf_ntb *ntb = ntb_ndev(ndev); in vntb_epf_db_clear() local
1311 ntb->db &= ~db_bits; in vntb_epf_db_clear()
1315 static int vntb_epf_link_disable(struct ntb_dev *ntb) in vntb_epf_link_disable() argument
1349 ndev->ntb.pdev = pdev; in pci_vntb_probe()
1350 ndev->ntb.topo = NTB_TOPO_NONE; in pci_vntb_probe()
1351 ndev->ntb.ops = &vntb_epf_ops; in pci_vntb_probe()
1359 ret = ntb_register_device(&ndev->ntb); in pci_vntb_probe()
1397 struct epf_ntb *ntb = epf_get_drvdata(epf); in epf_ntb_bind() local
1406 ret = epf_ntb_init_epc_bar(ntb); in epf_ntb_bind()
1412 ret = epf_ntb_config_spad_bar_alloc(ntb); in epf_ntb_bind()
1418 ret = epf_ntb_epc_init(ntb); in epf_ntb_bind()
1424 epf_set_drvdata(epf, ntb); in epf_ntb_bind()
1426 pci_space[0] = (ntb->vntb_pid << 16) | ntb->vntb_vid; in epf_ntb_bind()
1427 pci_vntb_table[0].vendor = ntb->vntb_vid; in epf_ntb_bind()
1428 pci_vntb_table[0].device = ntb->vntb_pid; in epf_ntb_bind()
1436 ret = vpci_scan_bus(ntb); in epf_ntb_bind()
1445 epf_ntb_epc_cleanup(ntb); in epf_ntb_bind()
1447 epf_ntb_config_spad_bar_free(ntb); in epf_ntb_bind()
1450 epf_ntb_epc_destroy(ntb); in epf_ntb_bind()
1463 struct epf_ntb *ntb = epf_get_drvdata(epf); in epf_ntb_unbind() local
1465 epf_ntb_epc_cleanup(ntb); in epf_ntb_unbind()
1466 epf_ntb_config_spad_bar_free(ntb); in epf_ntb_unbind()
1467 epf_ntb_epc_destroy(ntb); in epf_ntb_unbind()
1492 struct epf_ntb *ntb; in epf_ntb_probe() local
1498 ntb = devm_kzalloc(dev, sizeof(*ntb), GFP_KERNEL); in epf_ntb_probe()
1499 if (!ntb) in epf_ntb_probe()
1503 ntb->epf = epf; in epf_ntb_probe()
1504 ntb->vbus_number = 0xff; in epf_ntb_probe()
1508 ntb->epf_ntb_bar[i] = NO_BAR; in epf_ntb_probe()
1510 epf_set_drvdata(epf, ntb); in epf_ntb_probe()