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()
256 struct iosm_pcie *ipc_pcie = kzalloc(sizeof(*ipc_pcie), GFP_KERNEL); in ipc_pcie_probe() local
261 if (!ipc_pcie) in ipc_pcie_probe()
265 ipc_pcie->dev = &pci->dev; in ipc_pcie_probe()
268 pci_set_drvdata(pci, ipc_pcie); in ipc_pcie_probe()
271 ipc_pcie->pci = pci; in ipc_pcie_probe()
274 ipc_pcie_config_init(ipc_pcie); in ipc_pcie_probe()
280 dev_err(ipc_pcie->dev, "failed to enable the AP PCIe device"); in ipc_pcie_probe()
289 ipc_pcie_config_aspm(ipc_pcie); in ipc_pcie_probe()
290 dev_dbg(ipc_pcie->dev, "PCIe device enabled."); in ipc_pcie_probe()
294 ipc_pcie->d3l2_support = ipc_pcie_read_bios_cfg(&pci->dev); in ipc_pcie_probe()
296 ipc_pcie->suspend = 0; in ipc_pcie_probe()
298 if (ipc_pcie_resources_request(ipc_pcie)) in ipc_pcie_probe()
302 ipc_pcie->imem = ipc_imem_init(ipc_pcie, pci->device, in ipc_pcie_probe()
303 ipc_pcie->scratchpad, ipc_pcie->dev); in ipc_pcie_probe()
304 if (!ipc_pcie->imem) { in ipc_pcie_probe()
305 dev_err(ipc_pcie->dev, "failed to init imem"); in ipc_pcie_probe()
312 ipc_pcie_resources_release(ipc_pcie); in ipc_pcie_probe()
316 kfree(ipc_pcie); in ipc_pcie_probe()
330 static int __maybe_unused ipc_pcie_suspend_s2idle(struct iosm_pcie *ipc_pcie) in ipc_pcie_suspend_s2idle() argument
332 ipc_cp_irq_sleep_control(ipc_pcie, IPC_MEM_DEV_PM_FORCE_SLEEP); in ipc_pcie_suspend_s2idle()
337 set_bit(0, &ipc_pcie->suspend); in ipc_pcie_suspend_s2idle()
342 ipc_imem_pm_s2idle_sleep(ipc_pcie->imem, true); in ipc_pcie_suspend_s2idle()
349 static int __maybe_unused ipc_pcie_resume_s2idle(struct iosm_pcie *ipc_pcie) in ipc_pcie_resume_s2idle() argument
351 ipc_cp_irq_sleep_control(ipc_pcie, IPC_MEM_DEV_PM_FORCE_ACTIVE); in ipc_pcie_resume_s2idle()
353 ipc_imem_pm_s2idle_sleep(ipc_pcie->imem, false); in ipc_pcie_resume_s2idle()
358 clear_bit(0, &ipc_pcie->suspend); in ipc_pcie_resume_s2idle()
365 int __maybe_unused ipc_pcie_suspend(struct iosm_pcie *ipc_pcie) in ipc_pcie_suspend() argument
368 ipc_imem_pm_suspend(ipc_pcie->imem); in ipc_pcie_suspend()
370 dev_dbg(ipc_pcie->dev, "SUSPEND done"); in ipc_pcie_suspend()
374 int __maybe_unused ipc_pcie_resume(struct iosm_pcie *ipc_pcie) in ipc_pcie_resume() argument
379 ipc_imem_pm_resume(ipc_pcie->imem); in ipc_pcie_resume()
381 dev_dbg(ipc_pcie->dev, "RESUME done"); in ipc_pcie_resume()
387 struct iosm_pcie *ipc_pcie; in ipc_pcie_suspend_cb() local
392 ipc_pcie = pci_get_drvdata(pdev); in ipc_pcie_suspend_cb()
394 switch (ipc_pcie->d3l2_support) { in ipc_pcie_suspend_cb()
396 ipc_pcie_suspend_s2idle(ipc_pcie); in ipc_pcie_suspend_cb()
399 ipc_pcie_suspend(ipc_pcie); in ipc_pcie_suspend_cb()
408 struct iosm_pcie *ipc_pcie; in ipc_pcie_resume_cb() local
413 ipc_pcie = pci_get_drvdata(pdev); in ipc_pcie_resume_cb()
415 switch (ipc_pcie->d3l2_support) { in ipc_pcie_resume_cb()
417 ipc_pcie_resume_s2idle(ipc_pcie); in ipc_pcie_resume_cb()
420 ipc_pcie_resume(ipc_pcie); in ipc_pcie_resume_cb()
440 int ipc_pcie_addr_map(struct iosm_pcie *ipc_pcie, unsigned char *data, in ipc_pcie_addr_map() argument
443 if (ipc_pcie->pci) { in ipc_pcie_addr_map()
444 *mapping = dma_map_single(&ipc_pcie->pci->dev, data, size, in ipc_pcie_addr_map()
446 if (dma_mapping_error(&ipc_pcie->pci->dev, *mapping)) { in ipc_pcie_addr_map()
447 dev_err(ipc_pcie->dev, "dma mapping failed"); in ipc_pcie_addr_map()
454 void ipc_pcie_addr_unmap(struct iosm_pcie *ipc_pcie, size_t size, in ipc_pcie_addr_unmap() argument
459 if (ipc_pcie->pci) in ipc_pcie_addr_unmap()
460 dma_unmap_single(&ipc_pcie->pci->dev, mapping, size, direction); in ipc_pcie_addr_unmap()
463 struct sk_buff *ipc_pcie_alloc_local_skb(struct iosm_pcie *ipc_pcie, in ipc_pcie_alloc_local_skb() argument
468 if (!ipc_pcie || !size) { in ipc_pcie_alloc_local_skb()
483 struct sk_buff *ipc_pcie_alloc_skb(struct iosm_pcie *ipc_pcie, size_t size, in ipc_pcie_alloc_skb() argument
487 struct sk_buff *skb = ipc_pcie_alloc_local_skb(ipc_pcie, flags, in ipc_pcie_alloc_skb()
495 if (ipc_pcie_addr_map(ipc_pcie, skb->data, size, mapping, direction)) { in ipc_pcie_alloc_skb()
510 void ipc_pcie_kfree_skb(struct iosm_pcie *ipc_pcie, struct sk_buff *skb) in ipc_pcie_kfree_skb() argument
515 ipc_pcie_addr_unmap(ipc_pcie, IPC_CB(skb)->len, IPC_CB(skb)->mapping, in ipc_pcie_kfree_skb()