Lines Matching refs:ipc_pcie

22 static void ipc_pcie_resources_release(struct iosm_pcie *ipc_pcie)  in ipc_pcie_resources_release()  argument
25 ipc_release_irq(ipc_pcie); in ipc_pcie_resources_release()
28 iounmap(ipc_pcie->scratchpad); in ipc_pcie_resources_release()
31 iounmap(ipc_pcie->ipc_regs); in ipc_pcie_resources_release()
37 pci_release_regions(ipc_pcie->pci); in ipc_pcie_resources_release()
40 static void ipc_pcie_cleanup(struct iosm_pcie *ipc_pcie) in ipc_pcie_cleanup() argument
43 ipc_imem_cleanup(ipc_pcie->imem); in ipc_pcie_cleanup()
45 ipc_pcie_resources_release(ipc_pcie); in ipc_pcie_cleanup()
48 pci_disable_device(ipc_pcie->pci); in ipc_pcie_cleanup()
51 static void ipc_pcie_deinit(struct iosm_pcie *ipc_pcie) in ipc_pcie_deinit() argument
53 kfree(ipc_pcie->imem); in ipc_pcie_deinit()
54 kfree(ipc_pcie); in ipc_pcie_deinit()
59 struct iosm_pcie *ipc_pcie = pci_get_drvdata(pci); in ipc_pcie_remove() local
61 ipc_pcie_cleanup(ipc_pcie); in ipc_pcie_remove()
63 ipc_pcie_deinit(ipc_pcie); in ipc_pcie_remove()
66 static int ipc_pcie_resources_request(struct iosm_pcie *ipc_pcie) in ipc_pcie_resources_request() argument
68 struct pci_dev *pci = ipc_pcie->pci; in ipc_pcie_resources_request()
78 dev_err(ipc_pcie->dev, "failed pci request regions"); in ipc_pcie_resources_request()
87 ipc_pcie->ipc_regs = pci_ioremap_bar(pci, ipc_pcie->ipc_regs_bar_nr); in ipc_pcie_resources_request()
89 if (!ipc_pcie->ipc_regs) { in ipc_pcie_resources_request()
90 dev_err(ipc_pcie->dev, "IPC REGS ioremap error"); in ipc_pcie_resources_request()
100 ipc_pcie->scratchpad = in ipc_pcie_resources_request()
101 pci_ioremap_bar(pci, ipc_pcie->scratchpad_bar_nr); in ipc_pcie_resources_request()
103 if (!ipc_pcie->scratchpad) { in ipc_pcie_resources_request()
104 dev_err(ipc_pcie->dev, "doorbell scratchpad ioremap error"); in ipc_pcie_resources_request()
110 ret = ipc_acquire_irq(ipc_pcie); in ipc_pcie_resources_request()
112 dev_err(ipc_pcie->dev, "acquiring MSI irq failed!"); in ipc_pcie_resources_request()
122 pcie_capability_read_dword(ipc_pcie->pci, PCI_EXP_DEVCAP2, &cap); in ipc_pcie_resources_request()
124 pcie_capability_set_word(ipc_pcie->pci, PCI_EXP_DEVCTL2, in ipc_pcie_resources_request()
127 dev_dbg(ipc_pcie->dev, "link between AP and CP is fully on"); in ipc_pcie_resources_request()
132 iounmap(ipc_pcie->scratchpad); in ipc_pcie_resources_request()
134 iounmap(ipc_pcie->ipc_regs); in ipc_pcie_resources_request()
141 bool ipc_pcie_check_aspm_enabled(struct iosm_pcie *ipc_pcie, in ipc_pcie_check_aspm_enabled() argument
149 pdev = ipc_pcie->pci->bus->self; in ipc_pcie_check_aspm_enabled()
151 pdev = ipc_pcie->pci; in ipc_pcie_check_aspm_enabled()
155 dev_dbg(ipc_pcie->dev, "ASPM L1: 0x%04X 0x%03X", pdev->device, value); in ipc_pcie_check_aspm_enabled()
161 bool ipc_pcie_check_data_link_active(struct iosm_pcie *ipc_pcie) in ipc_pcie_check_data_link_active() argument
166 if (!ipc_pcie->pci->bus || !ipc_pcie->pci->bus->self) { in ipc_pcie_check_data_link_active()
167 dev_err(ipc_pcie->dev, "root port not found"); in ipc_pcie_check_data_link_active()
171 parent = ipc_pcie->pci->bus->self; in ipc_pcie_check_data_link_active()
174 dev_dbg(ipc_pcie->dev, "Link status: 0x%04X", link_status); in ipc_pcie_check_data_link_active()
179 static bool ipc_pcie_check_aspm_supported(struct iosm_pcie *ipc_pcie, in ipc_pcie_check_aspm_supported() argument
187 pdev = ipc_pcie->pci->bus->self; in ipc_pcie_check_aspm_supported()
189 pdev = ipc_pcie->pci; in ipc_pcie_check_aspm_supported()
193 dev_dbg(ipc_pcie->dev, "ASPM L1 not supported: 0x%04X", in ipc_pcie_check_aspm_supported()
200 void ipc_pcie_config_aspm(struct iosm_pcie *ipc_pcie) in ipc_pcie_config_aspm() argument
205 if (!ipc_pcie_check_aspm_supported(ipc_pcie, true) || in ipc_pcie_config_aspm()
206 !ipc_pcie_check_aspm_supported(ipc_pcie, false)) in ipc_pcie_config_aspm()
209 parent_aspm_enabled = ipc_pcie_check_aspm_enabled(ipc_pcie, true); in ipc_pcie_config_aspm()
210 dev_aspm_enabled = ipc_pcie_check_aspm_enabled(ipc_pcie, false); in ipc_pcie_config_aspm()
212 dev_dbg(ipc_pcie->dev, "ASPM parent: %s device: %s", in ipc_pcie_config_aspm()
218 static void ipc_pcie_config_init(struct iosm_pcie *ipc_pcie) in ipc_pcie_config_init() argument
221 ipc_pcie->ipc_regs_bar_nr = IPC_DOORBELL_BAR0; in ipc_pcie_config_init()
224 ipc_pcie->scratchpad_bar_nr = IPC_SCRATCHPAD_BAR2; in ipc_pcie_config_init()
225 ipc_pcie->doorbell_reg_offset = IPC_DOORBELL_CH_OFFSET; in ipc_pcie_config_init()
226 ipc_pcie->doorbell_write = IPC_WRITE_PTR_REG_0; in ipc_pcie_config_init()
227 ipc_pcie->doorbell_capture = IPC_CAPTURE_PTR_REG_0; in ipc_pcie_config_init()
261 struct iosm_pcie *ipc_pcie = kzalloc(sizeof(*ipc_pcie), GFP_KERNEL); in ipc_pcie_probe() local
267 if (!ipc_pcie) in ipc_pcie_probe()
271 ipc_pcie->dev = &pci->dev; in ipc_pcie_probe()
274 pci_set_drvdata(pci, ipc_pcie); in ipc_pcie_probe()
277 ipc_pcie->pci = pci; in ipc_pcie_probe()
280 ipc_pcie_config_init(ipc_pcie); in ipc_pcie_probe()
286 dev_err(ipc_pcie->dev, "failed to enable the AP PCIe device"); in ipc_pcie_probe()
295 ret = dma_set_mask(ipc_pcie->dev, DMA_BIT_MASK(64)); in ipc_pcie_probe()
297 dev_err(ipc_pcie->dev, "Could not set PCI DMA mask: %d", ret); in ipc_pcie_probe()
301 ipc_pcie_config_aspm(ipc_pcie); in ipc_pcie_probe()
302 dev_dbg(ipc_pcie->dev, "PCIe device enabled."); in ipc_pcie_probe()
306 ipc_pcie->d3l2_support = ipc_pcie_read_bios_cfg(&pci->dev); in ipc_pcie_probe()
308 ipc_pcie->suspend = 0; in ipc_pcie_probe()
310 if (ipc_pcie_resources_request(ipc_pcie)) in ipc_pcie_probe()
314 ipc_pcie->imem = ipc_imem_init(ipc_pcie, pci->device, in ipc_pcie_probe()
315 ipc_pcie->scratchpad, ipc_pcie->dev); in ipc_pcie_probe()
316 if (!ipc_pcie->imem) { in ipc_pcie_probe()
317 dev_err(ipc_pcie->dev, "failed to init imem"); in ipc_pcie_probe()
324 ipc_pcie_resources_release(ipc_pcie); in ipc_pcie_probe()
328 kfree(ipc_pcie); in ipc_pcie_probe()
342 static int __maybe_unused ipc_pcie_suspend_s2idle(struct iosm_pcie *ipc_pcie) in ipc_pcie_suspend_s2idle() argument
344 ipc_cp_irq_sleep_control(ipc_pcie, IPC_MEM_DEV_PM_FORCE_SLEEP); in ipc_pcie_suspend_s2idle()
349 set_bit(0, &ipc_pcie->suspend); in ipc_pcie_suspend_s2idle()
354 ipc_imem_pm_s2idle_sleep(ipc_pcie->imem, true); in ipc_pcie_suspend_s2idle()
361 static int __maybe_unused ipc_pcie_resume_s2idle(struct iosm_pcie *ipc_pcie) in ipc_pcie_resume_s2idle() argument
363 ipc_cp_irq_sleep_control(ipc_pcie, IPC_MEM_DEV_PM_FORCE_ACTIVE); in ipc_pcie_resume_s2idle()
365 ipc_imem_pm_s2idle_sleep(ipc_pcie->imem, false); in ipc_pcie_resume_s2idle()
370 clear_bit(0, &ipc_pcie->suspend); in ipc_pcie_resume_s2idle()
377 int __maybe_unused ipc_pcie_suspend(struct iosm_pcie *ipc_pcie) in ipc_pcie_suspend() argument
380 ipc_imem_pm_suspend(ipc_pcie->imem); in ipc_pcie_suspend()
382 dev_dbg(ipc_pcie->dev, "SUSPEND done"); in ipc_pcie_suspend()
386 int __maybe_unused ipc_pcie_resume(struct iosm_pcie *ipc_pcie) in ipc_pcie_resume() argument
391 ipc_imem_pm_resume(ipc_pcie->imem); in ipc_pcie_resume()
393 dev_dbg(ipc_pcie->dev, "RESUME done"); in ipc_pcie_resume()
399 struct iosm_pcie *ipc_pcie; in ipc_pcie_suspend_cb() local
404 ipc_pcie = pci_get_drvdata(pdev); in ipc_pcie_suspend_cb()
406 switch (ipc_pcie->d3l2_support) { in ipc_pcie_suspend_cb()
408 ipc_pcie_suspend_s2idle(ipc_pcie); in ipc_pcie_suspend_cb()
411 ipc_pcie_suspend(ipc_pcie); in ipc_pcie_suspend_cb()
420 struct iosm_pcie *ipc_pcie; in ipc_pcie_resume_cb() local
425 ipc_pcie = pci_get_drvdata(pdev); in ipc_pcie_resume_cb()
427 switch (ipc_pcie->d3l2_support) { in ipc_pcie_resume_cb()
429 ipc_pcie_resume_s2idle(ipc_pcie); in ipc_pcie_resume_cb()
432 ipc_pcie_resume(ipc_pcie); in ipc_pcie_resume_cb()
452 int ipc_pcie_addr_map(struct iosm_pcie *ipc_pcie, unsigned char *data, in ipc_pcie_addr_map() argument
455 if (ipc_pcie->pci) { in ipc_pcie_addr_map()
456 *mapping = dma_map_single(&ipc_pcie->pci->dev, data, size, in ipc_pcie_addr_map()
458 if (dma_mapping_error(&ipc_pcie->pci->dev, *mapping)) { in ipc_pcie_addr_map()
459 dev_err(ipc_pcie->dev, "dma mapping failed"); in ipc_pcie_addr_map()
466 void ipc_pcie_addr_unmap(struct iosm_pcie *ipc_pcie, size_t size, in ipc_pcie_addr_unmap() argument
471 if (ipc_pcie->pci) in ipc_pcie_addr_unmap()
472 dma_unmap_single(&ipc_pcie->pci->dev, mapping, size, direction); in ipc_pcie_addr_unmap()
475 struct sk_buff *ipc_pcie_alloc_local_skb(struct iosm_pcie *ipc_pcie, in ipc_pcie_alloc_local_skb() argument
480 if (!ipc_pcie || !size) { in ipc_pcie_alloc_local_skb()
495 struct sk_buff *ipc_pcie_alloc_skb(struct iosm_pcie *ipc_pcie, size_t size, in ipc_pcie_alloc_skb() argument
499 struct sk_buff *skb = ipc_pcie_alloc_local_skb(ipc_pcie, flags, in ipc_pcie_alloc_skb()
507 if (ipc_pcie_addr_map(ipc_pcie, skb->data, size, mapping, direction)) { in ipc_pcie_alloc_skb()
522 void ipc_pcie_kfree_skb(struct iosm_pcie *ipc_pcie, struct sk_buff *skb) in ipc_pcie_kfree_skb() argument
527 ipc_pcie_addr_unmap(ipc_pcie, IPC_CB(skb)->len, IPC_CB(skb)->mapping, in ipc_pcie_kfree_skb()