Lines Matching full:ep
21 * @ep: DWC EP device
27 dw_pcie_ep_get_func_from_ep(struct dw_pcie_ep *ep, u8 func_no) in dw_pcie_ep_get_func_from_ep() argument
31 list_for_each_entry(ep_func, &ep->func_list, list) { in dw_pcie_ep_get_func_from_ep()
42 struct dw_pcie_ep *ep = &pci->ep; in __dw_pcie_ep_reset_bar() local
47 dw_pcie_ep_writel_dbi2(ep, func_no, reg, 0x0); in __dw_pcie_ep_reset_bar()
48 dw_pcie_ep_writel_dbi(ep, func_no, reg, 0x0); in __dw_pcie_ep_reset_bar()
50 dw_pcie_ep_writel_dbi2(ep, func_no, reg + 4, 0x0); in __dw_pcie_ep_reset_bar()
51 dw_pcie_ep_writel_dbi(ep, func_no, reg + 4, 0x0); in __dw_pcie_ep_reset_bar()
65 funcs = pci->ep.epc->max_functions; in dw_pcie_ep_reset_bar()
72 static u8 __dw_pcie_ep_find_next_cap(struct dw_pcie_ep *ep, u8 func_no, in __dw_pcie_ep_find_next_cap() argument
81 reg = dw_pcie_ep_readw_dbi(ep, func_no, cap_ptr); in __dw_pcie_ep_find_next_cap()
91 return __dw_pcie_ep_find_next_cap(ep, func_no, next_cap_ptr, cap); in __dw_pcie_ep_find_next_cap()
94 static u8 dw_pcie_ep_find_capability(struct dw_pcie_ep *ep, u8 func_no, u8 cap) in dw_pcie_ep_find_capability() argument
99 reg = dw_pcie_ep_readw_dbi(ep, func_no, PCI_CAPABILITY_LIST); in dw_pcie_ep_find_capability()
102 return __dw_pcie_ep_find_next_cap(ep, func_no, next_cap_ptr, cap); in dw_pcie_ep_find_capability()
108 struct dw_pcie_ep *ep = epc_get_drvdata(epc); in dw_pcie_ep_write_header() local
109 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in dw_pcie_ep_write_header()
112 dw_pcie_ep_writew_dbi(ep, func_no, PCI_VENDOR_ID, hdr->vendorid); in dw_pcie_ep_write_header()
113 dw_pcie_ep_writew_dbi(ep, func_no, PCI_DEVICE_ID, hdr->deviceid); in dw_pcie_ep_write_header()
114 dw_pcie_ep_writeb_dbi(ep, func_no, PCI_REVISION_ID, hdr->revid); in dw_pcie_ep_write_header()
115 dw_pcie_ep_writeb_dbi(ep, func_no, PCI_CLASS_PROG, hdr->progif_code); in dw_pcie_ep_write_header()
116 dw_pcie_ep_writew_dbi(ep, func_no, PCI_CLASS_DEVICE, in dw_pcie_ep_write_header()
118 dw_pcie_ep_writeb_dbi(ep, func_no, PCI_CACHE_LINE_SIZE, in dw_pcie_ep_write_header()
120 dw_pcie_ep_writew_dbi(ep, func_no, PCI_SUBSYSTEM_VENDOR_ID, in dw_pcie_ep_write_header()
122 dw_pcie_ep_writew_dbi(ep, func_no, PCI_SUBSYSTEM_ID, hdr->subsys_id); in dw_pcie_ep_write_header()
123 dw_pcie_ep_writeb_dbi(ep, func_no, PCI_INTERRUPT_PIN, in dw_pcie_ep_write_header()
130 static int dw_pcie_ep_inbound_atu(struct dw_pcie_ep *ep, u8 func_no, int type, in dw_pcie_ep_inbound_atu() argument
136 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in dw_pcie_ep_inbound_atu()
138 if (!ep->bar_to_atu[bar]) in dw_pcie_ep_inbound_atu()
139 free_win = find_first_zero_bit(ep->ib_window_map, pci->num_ib_windows); in dw_pcie_ep_inbound_atu()
141 free_win = ep->bar_to_atu[bar] - 1; in dw_pcie_ep_inbound_atu()
159 ep->bar_to_atu[bar] = free_win + 1; in dw_pcie_ep_inbound_atu()
160 set_bit(free_win, ep->ib_window_map); in dw_pcie_ep_inbound_atu()
165 static int dw_pcie_ep_outbound_atu(struct dw_pcie_ep *ep, in dw_pcie_ep_outbound_atu() argument
168 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in dw_pcie_ep_outbound_atu()
172 free_win = find_first_zero_bit(ep->ob_window_map, pci->num_ob_windows); in dw_pcie_ep_outbound_atu()
183 set_bit(free_win, ep->ob_window_map); in dw_pcie_ep_outbound_atu()
184 ep->outbound_addr[free_win] = atu->cpu_addr; in dw_pcie_ep_outbound_atu()
192 struct dw_pcie_ep *ep = epc_get_drvdata(epc); in dw_pcie_ep_clear_bar() local
193 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in dw_pcie_ep_clear_bar()
195 u32 atu_index = ep->bar_to_atu[bar] - 1; in dw_pcie_ep_clear_bar()
197 if (!ep->bar_to_atu[bar]) in dw_pcie_ep_clear_bar()
203 clear_bit(atu_index, ep->ib_window_map); in dw_pcie_ep_clear_bar()
204 ep->epf_bar[bar] = NULL; in dw_pcie_ep_clear_bar()
205 ep->bar_to_atu[bar] = 0; in dw_pcie_ep_clear_bar()
211 struct dw_pcie_ep *ep = epc_get_drvdata(epc); in dw_pcie_ep_set_bar() local
212 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in dw_pcie_ep_set_bar()
232 if (ep->epf_bar[bar]) { in dw_pcie_ep_set_bar()
237 if (ep->epf_bar[bar]->barno != bar || in dw_pcie_ep_set_bar()
238 ep->epf_bar[bar]->size != size || in dw_pcie_ep_set_bar()
239 ep->epf_bar[bar]->flags != flags) in dw_pcie_ep_set_bar()
253 dw_pcie_ep_writel_dbi2(ep, func_no, reg, lower_32_bits(size - 1)); in dw_pcie_ep_set_bar()
254 dw_pcie_ep_writel_dbi(ep, func_no, reg, flags); in dw_pcie_ep_set_bar()
257 dw_pcie_ep_writel_dbi2(ep, func_no, reg + 4, upper_32_bits(size - 1)); in dw_pcie_ep_set_bar()
258 dw_pcie_ep_writel_dbi(ep, func_no, reg + 4, 0); in dw_pcie_ep_set_bar()
269 ret = dw_pcie_ep_inbound_atu(ep, func_no, type, epf_bar->phys_addr, bar, in dw_pcie_ep_set_bar()
274 ep->epf_bar[bar] = epf_bar; in dw_pcie_ep_set_bar()
279 static int dw_pcie_find_index(struct dw_pcie_ep *ep, phys_addr_t addr, in dw_pcie_find_index() argument
283 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in dw_pcie_find_index()
286 if (ep->outbound_addr[index] != addr) in dw_pcie_find_index()
298 struct dw_pcie_ep *ep = epc_get_drvdata(epc); in dw_pcie_ep_align_addr() local
299 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in dw_pcie_ep_align_addr()
314 struct dw_pcie_ep *ep = epc_get_drvdata(epc); in dw_pcie_ep_unmap_addr() local
315 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in dw_pcie_ep_unmap_addr()
317 ret = dw_pcie_find_index(ep, addr, &atu_index); in dw_pcie_ep_unmap_addr()
321 ep->outbound_addr[atu_index] = 0; in dw_pcie_ep_unmap_addr()
323 clear_bit(atu_index, ep->ob_window_map); in dw_pcie_ep_unmap_addr()
330 struct dw_pcie_ep *ep = epc_get_drvdata(epc); in dw_pcie_ep_map_addr() local
331 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in dw_pcie_ep_map_addr()
339 ret = dw_pcie_ep_outbound_atu(ep, &atu); in dw_pcie_ep_map_addr()
350 struct dw_pcie_ep *ep = epc_get_drvdata(epc); in dw_pcie_ep_get_msi() local
354 ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no); in dw_pcie_ep_get_msi()
359 val = dw_pcie_ep_readw_dbi(ep, func_no, reg); in dw_pcie_ep_get_msi()
371 struct dw_pcie_ep *ep = epc_get_drvdata(epc); in dw_pcie_ep_set_msi() local
372 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in dw_pcie_ep_set_msi()
376 ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no); in dw_pcie_ep_set_msi()
381 val = dw_pcie_ep_readw_dbi(ep, func_no, reg); in dw_pcie_ep_set_msi()
385 dw_pcie_ep_writew_dbi(ep, func_no, reg, val); in dw_pcie_ep_set_msi()
393 struct dw_pcie_ep *ep = epc_get_drvdata(epc); in dw_pcie_ep_get_msix() local
397 ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no); in dw_pcie_ep_get_msix()
402 val = dw_pcie_ep_readw_dbi(ep, func_no, reg); in dw_pcie_ep_get_msix()
414 struct dw_pcie_ep *ep = epc_get_drvdata(epc); in dw_pcie_ep_set_msix() local
415 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in dw_pcie_ep_set_msix()
419 ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no); in dw_pcie_ep_set_msix()
426 val = dw_pcie_ep_readw_dbi(ep, func_no, reg); in dw_pcie_ep_set_msix()
433 dw_pcie_ep_writel_dbi(ep, func_no, reg, val); in dw_pcie_ep_set_msix()
437 dw_pcie_ep_writel_dbi(ep, func_no, reg, val); in dw_pcie_ep_set_msix()
447 struct dw_pcie_ep *ep = epc_get_drvdata(epc); in dw_pcie_ep_raise_irq() local
449 if (!ep->ops->raise_irq) in dw_pcie_ep_raise_irq()
452 return ep->ops->raise_irq(ep, func_no, type, interrupt_num); in dw_pcie_ep_raise_irq()
457 struct dw_pcie_ep *ep = epc_get_drvdata(epc); in dw_pcie_ep_stop() local
458 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in dw_pcie_ep_stop()
465 struct dw_pcie_ep *ep = epc_get_drvdata(epc); in dw_pcie_ep_start() local
466 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in dw_pcie_ep_start()
474 struct dw_pcie_ep *ep = epc_get_drvdata(epc); in dw_pcie_ep_get_features() local
476 if (!ep->ops->get_features) in dw_pcie_ep_get_features()
479 return ep->ops->get_features(ep); in dw_pcie_ep_get_features()
501 * @ep: DWC EP device
506 int dw_pcie_ep_raise_intx_irq(struct dw_pcie_ep *ep, u8 func_no) in dw_pcie_ep_raise_intx_irq() argument
508 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in dw_pcie_ep_raise_intx_irq()
511 dev_err(dev, "EP cannot raise INTX IRQs\n"); in dw_pcie_ep_raise_intx_irq()
519 * @ep: DWC EP device
525 int dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, u8 func_no, in dw_pcie_ep_raise_msi_irq() argument
530 struct pci_epc *epc = ep->epc; in dw_pcie_ep_raise_msi_irq()
538 ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no); in dw_pcie_ep_raise_msi_irq()
544 msg_ctrl = dw_pcie_ep_readw_dbi(ep, func_no, reg); in dw_pcie_ep_raise_msi_irq()
547 msg_addr_lower = dw_pcie_ep_readl_dbi(ep, func_no, reg); in dw_pcie_ep_raise_msi_irq()
550 msg_addr_upper = dw_pcie_ep_readl_dbi(ep, func_no, reg); in dw_pcie_ep_raise_msi_irq()
552 msg_data = dw_pcie_ep_readw_dbi(ep, func_no, reg); in dw_pcie_ep_raise_msi_irq()
556 msg_data = dw_pcie_ep_readw_dbi(ep, func_no, reg); in dw_pcie_ep_raise_msi_irq()
561 ret = dw_pcie_ep_map_addr(epc, func_no, 0, ep->msi_mem_phys, msg_addr, in dw_pcie_ep_raise_msi_irq()
566 writel(msg_data | (interrupt_num - 1), ep->msi_mem + offset); in dw_pcie_ep_raise_msi_irq()
568 dw_pcie_ep_unmap_addr(epc, func_no, 0, ep->msi_mem_phys); in dw_pcie_ep_raise_msi_irq()
577 * @ep: DWC EP device
583 int dw_pcie_ep_raise_msix_irq_doorbell(struct dw_pcie_ep *ep, u8 func_no, in dw_pcie_ep_raise_msix_irq_doorbell() argument
586 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in dw_pcie_ep_raise_msix_irq_doorbell()
590 ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no); in dw_pcie_ep_raise_msix_irq_doorbell()
604 * @ep: DWC EP device
610 int dw_pcie_ep_raise_msix_irq(struct dw_pcie_ep *ep, u8 func_no, in dw_pcie_ep_raise_msix_irq() argument
613 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in dw_pcie_ep_raise_msix_irq()
616 struct pci_epc *epc = ep->epc; in dw_pcie_ep_raise_msix_irq()
625 ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no); in dw_pcie_ep_raise_msix_irq()
630 tbl_offset = dw_pcie_ep_readl_dbi(ep, func_no, reg); in dw_pcie_ep_raise_msix_irq()
634 msix_tbl = ep->epf_bar[bir]->addr + tbl_offset; in dw_pcie_ep_raise_msix_irq()
645 ret = dw_pcie_ep_map_addr(epc, func_no, 0, ep->msi_mem_phys, msg_addr, in dw_pcie_ep_raise_msix_irq()
650 writel(msg_data, ep->msi_mem + offset); in dw_pcie_ep_raise_msix_irq()
652 dw_pcie_ep_unmap_addr(epc, func_no, 0, ep->msi_mem_phys); in dw_pcie_ep_raise_msix_irq()
658 * dw_pcie_ep_cleanup - Cleanup DWC EP resources after fundamental reset
659 * @ep: DWC EP device
661 * Cleans up the DWC EP specific resources like eDMA etc... after fundamental
665 void dw_pcie_ep_cleanup(struct dw_pcie_ep *ep) in dw_pcie_ep_cleanup() argument
667 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in dw_pcie_ep_cleanup()
675 * @ep: DWC EP device
680 void dw_pcie_ep_deinit(struct dw_pcie_ep *ep) in dw_pcie_ep_deinit() argument
682 struct pci_epc *epc = ep->epc; in dw_pcie_ep_deinit()
684 dw_pcie_ep_cleanup(ep); in dw_pcie_ep_deinit()
686 pci_epc_mem_free_addr(epc, ep->msi_mem_phys, ep->msi_mem, in dw_pcie_ep_deinit()
740 * dw_pcie_ep_init_registers - Initialize DWC EP specific registers
741 * @ep: DWC EP device
743 * Initialize the registers (CSRs) specific to DWC EP. This API should be called
747 int dw_pcie_ep_init_registers(struct dw_pcie_ep *ep) in dw_pcie_ep_init_registers() argument
749 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in dw_pcie_ep_init_registers()
752 struct pci_epc *epc = ep->epc; in dw_pcie_ep_init_registers()
763 "PCIe controller is not set to EP mode (hdr_type:0x%x)!\n", in dw_pcie_ep_init_registers()
777 if (!ep->ib_window_map) { in dw_pcie_ep_init_registers()
778 ep->ib_window_map = devm_bitmap_zalloc(dev, pci->num_ib_windows, in dw_pcie_ep_init_registers()
780 if (!ep->ib_window_map) in dw_pcie_ep_init_registers()
784 if (!ep->ob_window_map) { in dw_pcie_ep_init_registers()
785 ep->ob_window_map = devm_bitmap_zalloc(dev, pci->num_ob_windows, in dw_pcie_ep_init_registers()
787 if (!ep->ob_window_map) in dw_pcie_ep_init_registers()
791 if (!ep->outbound_addr) { in dw_pcie_ep_init_registers()
796 ep->outbound_addr = addr; in dw_pcie_ep_init_registers()
801 ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no); in dw_pcie_ep_init_registers()
810 ep_func->msi_cap = dw_pcie_ep_find_capability(ep, func_no, in dw_pcie_ep_init_registers()
812 ep_func->msix_cap = dw_pcie_ep_find_capability(ep, func_no, in dw_pcie_ep_init_registers()
815 list_add_tail(&ep_func->list, &ep->func_list); in dw_pcie_ep_init_registers()
818 if (ep->ops->init) in dw_pcie_ep_init_registers()
819 ep->ops->init(ep); in dw_pcie_ep_init_registers()
852 * @ep: DWC EP device
854 void dw_pcie_ep_linkup(struct dw_pcie_ep *ep) in dw_pcie_ep_linkup() argument
856 struct pci_epc *epc = ep->epc; in dw_pcie_ep_linkup()
864 * @ep: DWC EP device
870 void dw_pcie_ep_linkdown(struct dw_pcie_ep *ep) in dw_pcie_ep_linkdown() argument
872 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in dw_pcie_ep_linkdown()
873 struct pci_epc *epc = ep->epc; in dw_pcie_ep_linkdown()
889 * @ep: DWC EP device
896 int dw_pcie_ep_init(struct dw_pcie_ep *ep) in dw_pcie_ep_init() argument
901 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in dw_pcie_ep_init()
906 INIT_LIST_HEAD(&ep->func_list); in dw_pcie_ep_init()
916 ep->phys_base = res->start; in dw_pcie_ep_init()
917 ep->addr_size = resource_size(res); in dw_pcie_ep_init()
919 if (ep->ops->pre_init) in dw_pcie_ep_init()
920 ep->ops->pre_init(ep); in dw_pcie_ep_init()
928 ep->epc = epc; in dw_pcie_ep_init()
929 epc_set_drvdata(epc, ep); in dw_pcie_ep_init()
935 ret = pci_epc_mem_init(epc, ep->phys_base, ep->addr_size, in dw_pcie_ep_init()
936 ep->page_size); in dw_pcie_ep_init()
942 ep->msi_mem = pci_epc_mem_alloc_addr(epc, &ep->msi_mem_phys, in dw_pcie_ep_init()
944 if (!ep->msi_mem) { in dw_pcie_ep_init()