Lines Matching refs:ipc_pcie

22 static void ipc_pcie_resources_release(struct iosm_pcie *ipc_pcie)
25 ipc_release_irq(ipc_pcie);
28 iounmap(ipc_pcie->scratchpad);
31 iounmap(ipc_pcie->ipc_regs);
37 pci_release_regions(ipc_pcie->pci);
40 static void ipc_pcie_cleanup(struct iosm_pcie *ipc_pcie)
43 ipc_imem_cleanup(ipc_pcie->imem);
45 ipc_pcie_resources_release(ipc_pcie);
48 pci_disable_device(ipc_pcie->pci);
51 static void ipc_pcie_deinit(struct iosm_pcie *ipc_pcie)
53 kfree(ipc_pcie->imem);
54 kfree(ipc_pcie);
59 struct iosm_pcie *ipc_pcie = pci_get_drvdata(pci);
61 ipc_pcie_cleanup(ipc_pcie);
63 ipc_pcie_deinit(ipc_pcie);
66 static int ipc_pcie_resources_request(struct iosm_pcie *ipc_pcie)
68 struct pci_dev *pci = ipc_pcie->pci;
78 dev_err(ipc_pcie->dev, "failed pci request regions");
87 ipc_pcie->ipc_regs = pci_ioremap_bar(pci, ipc_pcie->ipc_regs_bar_nr);
89 if (!ipc_pcie->ipc_regs) {
90 dev_err(ipc_pcie->dev, "IPC REGS ioremap error");
100 ipc_pcie->scratchpad =
101 pci_ioremap_bar(pci, ipc_pcie->scratchpad_bar_nr);
103 if (!ipc_pcie->scratchpad) {
104 dev_err(ipc_pcie->dev, "doorbell scratchpad ioremap error");
110 ret = ipc_acquire_irq(ipc_pcie);
112 dev_err(ipc_pcie->dev, "acquiring MSI irq failed!");
122 pcie_capability_read_dword(ipc_pcie->pci, PCI_EXP_DEVCAP2, &cap);
124 pcie_capability_set_word(ipc_pcie->pci, PCI_EXP_DEVCTL2,
127 dev_dbg(ipc_pcie->dev, "link between AP and CP is fully on");
132 iounmap(ipc_pcie->scratchpad);
134 iounmap(ipc_pcie->ipc_regs);
141 bool ipc_pcie_check_aspm_enabled(struct iosm_pcie *ipc_pcie,
149 pdev = ipc_pcie->pci->bus->self;
151 pdev = ipc_pcie->pci;
155 dev_dbg(ipc_pcie->dev, "ASPM L1: 0x%04X 0x%03X", pdev->device, value);
161 bool ipc_pcie_check_data_link_active(struct iosm_pcie *ipc_pcie)
166 if (!ipc_pcie->pci->bus || !ipc_pcie->pci->bus->self) {
167 dev_err(ipc_pcie->dev, "root port not found");
171 parent = ipc_pcie->pci->bus->self;
174 dev_dbg(ipc_pcie->dev, "Link status: 0x%04X", link_status);
179 static bool ipc_pcie_check_aspm_supported(struct iosm_pcie *ipc_pcie,
187 pdev = ipc_pcie->pci->bus->self;
189 pdev = ipc_pcie->pci;
193 dev_dbg(ipc_pcie->dev, "ASPM L1 not supported: 0x%04X",
200 void ipc_pcie_config_aspm(struct iosm_pcie *ipc_pcie)
205 if (!ipc_pcie_check_aspm_supported(ipc_pcie, true) ||
206 !ipc_pcie_check_aspm_supported(ipc_pcie, false))
209 parent_aspm_enabled = ipc_pcie_check_aspm_enabled(ipc_pcie, true);
210 dev_aspm_enabled = ipc_pcie_check_aspm_enabled(ipc_pcie, false);
212 dev_dbg(ipc_pcie->dev, "ASPM parent: %s device: %s",
218 static void ipc_pcie_config_init(struct iosm_pcie *ipc_pcie)
221 ipc_pcie->ipc_regs_bar_nr = IPC_DOORBELL_BAR0;
224 ipc_pcie->scratchpad_bar_nr = IPC_SCRATCHPAD_BAR2;
225 ipc_pcie->doorbell_reg_offset = IPC_DOORBELL_CH_OFFSET;
226 ipc_pcie->doorbell_write = IPC_WRITE_PTR_REG_0;
227 ipc_pcie->doorbell_capture = IPC_CAPTURE_PTR_REG_0;
261 struct iosm_pcie *ipc_pcie = kzalloc(sizeof(*ipc_pcie), GFP_KERNEL);
267 if (!ipc_pcie)
271 ipc_pcie->dev = &pci->dev;
274 pci_set_drvdata(pci, ipc_pcie);
277 ipc_pcie->pci = pci;
280 ipc_pcie_config_init(ipc_pcie);
286 dev_err(ipc_pcie->dev, "failed to enable the AP PCIe device");
295 ret = dma_set_mask(ipc_pcie->dev, DMA_BIT_MASK(64));
297 dev_err(ipc_pcie->dev, "Could not set PCI DMA mask: %d", ret);
301 ipc_pcie_config_aspm(ipc_pcie);
302 dev_dbg(ipc_pcie->dev, "PCIe device enabled.");
306 ipc_pcie->d3l2_support = ipc_pcie_read_bios_cfg(&pci->dev);
308 ipc_pcie->suspend = 0;
310 if (ipc_pcie_resources_request(ipc_pcie))
314 ipc_pcie->imem = ipc_imem_init(ipc_pcie, pci->device,
315 ipc_pcie->scratchpad, ipc_pcie->dev);
316 if (!ipc_pcie->imem) {
317 dev_err(ipc_pcie->dev, "failed to init imem");
324 ipc_pcie_resources_release(ipc_pcie);
329 kfree(ipc_pcie);
343 static int __maybe_unused ipc_pcie_suspend_s2idle(struct iosm_pcie *ipc_pcie)
345 ipc_cp_irq_sleep_control(ipc_pcie, IPC_MEM_DEV_PM_FORCE_SLEEP);
350 set_bit(0, &ipc_pcie->suspend);
355 ipc_imem_pm_s2idle_sleep(ipc_pcie->imem, true);
362 static int __maybe_unused ipc_pcie_resume_s2idle(struct iosm_pcie *ipc_pcie)
364 ipc_cp_irq_sleep_control(ipc_pcie, IPC_MEM_DEV_PM_FORCE_ACTIVE);
366 ipc_imem_pm_s2idle_sleep(ipc_pcie->imem, false);
371 clear_bit(0, &ipc_pcie->suspend);
378 int __maybe_unused ipc_pcie_suspend(struct iosm_pcie *ipc_pcie)
381 ipc_imem_pm_suspend(ipc_pcie->imem);
383 dev_dbg(ipc_pcie->dev, "SUSPEND done");
387 int __maybe_unused ipc_pcie_resume(struct iosm_pcie *ipc_pcie)
392 ipc_imem_pm_resume(ipc_pcie->imem);
394 dev_dbg(ipc_pcie->dev, "RESUME done");
400 struct iosm_pcie *ipc_pcie;
405 ipc_pcie = pci_get_drvdata(pdev);
407 switch (ipc_pcie->d3l2_support) {
409 ipc_pcie_suspend_s2idle(ipc_pcie);
412 ipc_pcie_suspend(ipc_pcie);
421 struct iosm_pcie *ipc_pcie;
426 ipc_pcie = pci_get_drvdata(pdev);
428 switch (ipc_pcie->d3l2_support) {
430 ipc_pcie_resume_s2idle(ipc_pcie);
433 ipc_pcie_resume(ipc_pcie);
453 int ipc_pcie_addr_map(struct iosm_pcie *ipc_pcie, unsigned char *data,
456 if (ipc_pcie->pci) {
457 *mapping = dma_map_single(&ipc_pcie->pci->dev, data, size,
459 if (dma_mapping_error(&ipc_pcie->pci->dev, *mapping)) {
460 dev_err(ipc_pcie->dev, "dma mapping failed");
467 void ipc_pcie_addr_unmap(struct iosm_pcie *ipc_pcie, size_t size,
472 if (ipc_pcie->pci)
473 dma_unmap_single(&ipc_pcie->pci->dev, mapping, size, direction);
476 struct sk_buff *ipc_pcie_alloc_local_skb(struct iosm_pcie *ipc_pcie,
481 if (!ipc_pcie || !size) {
496 struct sk_buff *ipc_pcie_alloc_skb(struct iosm_pcie *ipc_pcie, size_t size,
500 struct sk_buff *skb = ipc_pcie_alloc_local_skb(ipc_pcie, flags,
508 if (ipc_pcie_addr_map(ipc_pcie, skb->data, size, mapping, direction)) {
523 void ipc_pcie_kfree_skb(struct iosm_pcie *ipc_pcie, struct sk_buff *skb)
528 ipc_pcie_addr_unmap(ipc_pcie, IPC_CB(skb)->len, IPC_CB(skb)->mapping,