Lines Matching +full:firmware +full:- +full:initialised
1 // SPDX-License-Identifier: BSD-3-Clause-Clear
3 * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved.
4 * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
50 return mhi_device_get_sync(ab_pci->mhi_ctrl->mhi_dev); in ath11k_pci_bus_wake_up()
57 mhi_device_put(ab_pci->mhi_ctrl->mhi_dev); in ath11k_pci_bus_release()
62 if (!ab->hw_params.static_window_map) in ath11k_pci_get_window_start()
78 struct ath11k_base *ab = ab_pci->ab; in ath11k_pci_select_window()
82 lockdep_assert_held(&ab_pci->window_lock); in ath11k_pci_select_window()
84 if (window != ab_pci->register_window) { in ath11k_pci_select_window()
87 ab->mem + ATH11K_PCI_WINDOW_REG_ADDRESS); in ath11k_pci_select_window()
88 ioread32(ab->mem + ATH11K_PCI_WINDOW_REG_ADDRESS); in ath11k_pci_select_window()
91 (char *)ab->mem + ATH11K_PCI_WINDOW_REG_ADDRESS); in ath11k_pci_select_window()
92 ioread32((char *)ab->mem + ATH11K_PCI_WINDOW_REG_ADDRESS); in ath11k_pci_select_window()
94 ab_pci->register_window = window; in ath11k_pci_select_window()
107 spin_lock_bh(&ab_pci->window_lock); in ath11k_pci_window_write32()
110 iowrite32(value, ab->mem + window_start + in ath11k_pci_window_write32()
112 iowrite32(value, (char *)ab->mem + window_start + in ath11k_pci_window_write32()
115 spin_unlock_bh(&ab_pci->window_lock); in ath11k_pci_window_write32()
118 iowrite32(value, ab->mem + window_start + in ath11k_pci_window_write32()
120 iowrite32(value, (char *)ab->mem + window_start + in ath11k_pci_window_write32()
134 spin_lock_bh(&ab_pci->window_lock); in ath11k_pci_window_read32()
137 val = ioread32(ab->mem + window_start + in ath11k_pci_window_read32()
139 val = ioread32((char *)ab->mem + window_start + in ath11k_pci_window_read32()
142 spin_unlock_bh(&ab_pci->window_lock); in ath11k_pci_window_read32()
145 val = ioread32(ab->mem + window_start + in ath11k_pci_window_read32()
147 val = ioread32((char *)ab->mem + window_start + in ath11k_pci_window_read32()
157 struct pci_dev *pci_dev = to_pci_dev(ab->dev); in ath11k_pci_get_msi_irq()
201 ab_pci->ab->mem + ATH11K_PCI_WINDOW_REG_ADDRESS); in ath11k_pci_select_static_window()
203 (char *)ab_pci->ab->mem + ATH11K_PCI_WINDOW_REG_ADDRESS); in ath11k_pci_select_static_window()
286 return -ETIMEDOUT; in ath11k_pci_set_link_reg()
393 if (ab->hw_params.fix_l1ss) in ath11k_pci_sw_reset()
405 struct ath11k_qmi_ce_cfg *cfg = &ab->qmi.ce_cfg; in ath11k_pci_init_qmi_ce_config()
407 cfg->tgt_ce = ab->hw_params.target_ce_config; in ath11k_pci_init_qmi_ce_config()
408 cfg->tgt_ce_len = ab->hw_params.target_ce_count; in ath11k_pci_init_qmi_ce_config()
410 cfg->svc_to_ce_map = ab->hw_params.svc_to_ce_map; in ath11k_pci_init_qmi_ce_config()
411 cfg->svc_to_ce_map_len = ab->hw_params.svc_to_ce_map_len; in ath11k_pci_init_qmi_ce_config()
412 ab->qmi.service_ins_id = ab->hw_params.qmi_service_ins_id; in ath11k_pci_init_qmi_ce_config()
414 ath11k_ce_get_shadow_config(ab, &cfg->shadow_reg_v2, in ath11k_pci_init_qmi_ce_config()
415 &cfg->shadow_reg_v2_len); in ath11k_pci_init_qmi_ce_config()
420 struct pci_dev *dev = ab_pci->pdev; in ath11k_pci_msi_config()
423 pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control); in ath11k_pci_msi_config()
430 pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, control); in ath11k_pci_msi_config()
445 struct ath11k_base *ab = ab_pci->ab; in ath11k_pci_alloc_msi()
446 const struct ath11k_msi_config *msi_config = ab->pci.msi.config; in ath11k_pci_alloc_msi()
447 struct pci_dev *pci_dev = ab_pci->pdev; in ath11k_pci_alloc_msi()
453 msi_config->total_vectors, in ath11k_pci_alloc_msi()
454 msi_config->total_vectors, in ath11k_pci_alloc_msi()
456 if (num_vectors == msi_config->total_vectors) { in ath11k_pci_alloc_msi()
457 set_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags); in ath11k_pci_alloc_msi()
459 num_vectors = pci_alloc_irq_vectors(ab_pci->pdev, in ath11k_pci_alloc_msi()
464 ret = -EINVAL; in ath11k_pci_alloc_msi()
467 clear_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags); in ath11k_pci_alloc_msi()
468 ab->pci.msi.config = &msi_config_one_msi; in ath11k_pci_alloc_msi()
475 msi_desc = irq_get_msi_desc(ab_pci->pdev->irq); in ath11k_pci_alloc_msi()
478 ret = -EINVAL; in ath11k_pci_alloc_msi()
482 ab->pci.msi.ep_base_data = msi_desc->msg.data; in ath11k_pci_alloc_msi()
484 pci_read_config_dword(pci_dev, pci_dev->msi_cap + PCI_MSI_ADDRESS_LO, in ath11k_pci_alloc_msi()
485 &ab->pci.msi.addr_lo); in ath11k_pci_alloc_msi()
487 if (msi_desc->pci.msi_attrib.is_64) { in ath11k_pci_alloc_msi()
488 pci_read_config_dword(pci_dev, pci_dev->msi_cap + PCI_MSI_ADDRESS_HI, in ath11k_pci_alloc_msi()
489 &ab->pci.msi.addr_hi); in ath11k_pci_alloc_msi()
491 ab->pci.msi.addr_hi = 0; in ath11k_pci_alloc_msi()
494 ath11k_dbg(ab, ATH11K_DBG_PCI, "msi base data is %d\n", ab->pci.msi.ep_base_data); in ath11k_pci_alloc_msi()
499 pci_free_irq_vectors(ab_pci->pdev); in ath11k_pci_alloc_msi()
507 pci_free_irq_vectors(ab_pci->pdev); in ath11k_pci_free_msi()
514 msi_desc = irq_get_msi_desc(ab_pci->pdev->irq); in ath11k_pci_config_msi_data()
516 ath11k_err(ab_pci->ab, "msi_desc is NULL!\n"); in ath11k_pci_config_msi_data()
517 pci_free_irq_vectors(ab_pci->pdev); in ath11k_pci_config_msi_data()
518 return -EINVAL; in ath11k_pci_config_msi_data()
521 ab_pci->ab->pci.msi.ep_base_data = msi_desc->msg.data; in ath11k_pci_config_msi_data()
523 ath11k_dbg(ab_pci->ab, ATH11K_DBG_PCI, "after request_irq msi_ep_base_data %d\n", in ath11k_pci_config_msi_data()
524 ab_pci->ab->pci.msi.ep_base_data); in ath11k_pci_config_msi_data()
531 struct ath11k_base *ab = ab_pci->ab; in ath11k_pci_claim()
536 if (device_id != ab_pci->dev_id) { in ath11k_pci_claim()
538 device_id, ab_pci->dev_id); in ath11k_pci_claim()
539 ret = -EIO; in ath11k_pci_claim()
561 ret = dma_set_mask_and_coherent(&pdev->dev, in ath11k_pci_claim()
571 ab->mem_len = pci_resource_len(pdev, ATH11K_PCI_BAR_NUM); in ath11k_pci_claim()
572 ab->mem = pci_iomap(pdev, ATH11K_PCI_BAR_NUM, 0); in ath11k_pci_claim()
573 if (!ab->mem) { in ath11k_pci_claim()
575 ret = -EIO; in ath11k_pci_claim()
579 ab->mem_ce = ab->mem; in ath11k_pci_claim()
581 ath11k_dbg(ab, ATH11K_DBG_BOOT, "pci_mem 0x%p\n", ab->mem); in ath11k_pci_claim()
594 struct ath11k_base *ab = ab_pci->ab; in ath11k_pci_free_region()
595 struct pci_dev *pci_dev = ab_pci->pdev; in ath11k_pci_free_region()
597 pci_iounmap(pci_dev, ab->mem); in ath11k_pci_free_region()
598 ab->mem = NULL; in ath11k_pci_free_region()
606 struct ath11k_base *ab = ab_pci->ab; in ath11k_pci_aspm_disable()
608 pcie_capability_read_word(ab_pci->pdev, PCI_EXP_LNKCTL, in ath11k_pci_aspm_disable()
609 &ab_pci->link_ctl); in ath11k_pci_aspm_disable()
612 ab_pci->link_ctl, in ath11k_pci_aspm_disable()
613 u16_get_bits(ab_pci->link_ctl, PCI_EXP_LNKCTL_ASPM_L0S), in ath11k_pci_aspm_disable()
614 u16_get_bits(ab_pci->link_ctl, PCI_EXP_LNKCTL_ASPM_L1)); in ath11k_pci_aspm_disable()
617 pcie_capability_write_word(ab_pci->pdev, PCI_EXP_LNKCTL, in ath11k_pci_aspm_disable()
618 ab_pci->link_ctl & ~PCI_EXP_LNKCTL_ASPMC); in ath11k_pci_aspm_disable()
620 set_bit(ATH11K_PCI_ASPM_RESTORE, &ab_pci->flags); in ath11k_pci_aspm_disable()
625 if (test_and_clear_bit(ATH11K_PCI_ASPM_RESTORE, &ab_pci->flags)) in ath11k_pci_aspm_restore()
626 pcie_capability_write_word(ab_pci->pdev, PCI_EXP_LNKCTL, in ath11k_pci_aspm_restore()
627 ab_pci->link_ctl); in ath11k_pci_aspm_restore()
635 ab_pci->register_window = 0; in ath11k_pci_power_up()
636 clear_bit(ATH11K_FLAG_DEVICE_INIT_DONE, &ab->dev_flags); in ath11k_pci_power_up()
637 ath11k_pci_sw_reset(ab_pci->ab, true); in ath11k_pci_power_up()
639 /* Disable ASPM during firmware download due to problems switching in ath11k_pci_power_up()
652 if (ab->hw_params.static_window_map) in ath11k_pci_power_up()
662 /* restore aspm in case firmware bootup fails */ in ath11k_pci_power_down()
665 ath11k_pci_force_wake(ab_pci->ab); in ath11k_pci_power_down()
670 clear_bit(ATH11K_FLAG_DEVICE_INIT_DONE, &ab->dev_flags); in ath11k_pci_power_down()
671 ath11k_pci_sw_reset(ab_pci->ab, false); in ath11k_pci_power_down()
705 if (test_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags)) in ath11k_pci_start()
756 if (test_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab_pci->ab->dev_flags)) in ath11k_pci_set_irq_affinity_hint()
759 return irq_set_affinity_hint(ab_pci->pdev->irq, m); in ath11k_pci_set_irq_affinity_hint()
775 ab = ath11k_core_alloc(&pdev->dev, sizeof(*ab_pci), ATH11K_BUS_PCI); in ath11k_pci_probe()
778 dev_err(&pdev->dev, "failed to allocate ath11k base\n"); in ath11k_pci_probe()
779 return -ENOMEM; in ath11k_pci_probe()
782 ab->dev = &pdev->dev; in ath11k_pci_probe()
785 ab_pci->dev_id = pci_dev->device; in ath11k_pci_probe()
786 ab_pci->ab = ab; in ath11k_pci_probe()
787 ab_pci->pdev = pdev; in ath11k_pci_probe()
788 ab->hif.ops = &ath11k_pci_hif_ops; in ath11k_pci_probe()
789 ab->fw_mode = ATH11K_FIRMWARE_MODE_NORMAL; in ath11k_pci_probe()
791 spin_lock_init(&ab_pci->window_lock); in ath11k_pci_probe()
798 ret = of_property_read_u32(ab->dev->of_node, "memory-region", &addr); in ath11k_pci_probe()
800 set_bit(ATH11K_FLAG_FIXED_MEM_RGN, &ab->dev_flags); in ath11k_pci_probe()
810 pdev->vendor, pdev->device, in ath11k_pci_probe()
811 pdev->subsystem_vendor, pdev->subsystem_device); in ath11k_pci_probe()
813 ab->id.vendor = pdev->vendor; in ath11k_pci_probe()
814 ab->id.device = pdev->device; in ath11k_pci_probe()
815 ab->id.subsystem_vendor = pdev->subsystem_vendor; in ath11k_pci_probe()
816 ab->id.subsystem_device = pdev->subsystem_device; in ath11k_pci_probe()
818 switch (pci_dev->device) { in ath11k_pci_probe()
824 ab->hw_rev = ATH11K_HW_QCA6390_HW20; in ath11k_pci_probe()
827 dev_err(&pdev->dev, "Unsupported QCA6390 SOC hardware version: %d %d\n", in ath11k_pci_probe()
829 ret = -EOPNOTSUPP; in ath11k_pci_probe()
837 ab->hw_rev = ATH11K_HW_QCN9074_HW10; in ath11k_pci_probe()
840 ab->id.bdf_search = ATH11K_BDF_SEARCH_BUS_AND_BOARD; in ath11k_pci_probe()
848 ab->hw_rev = ATH11K_HW_WCN6855_HW20; in ath11k_pci_probe()
852 ab->hw_rev = ATH11K_HW_WCN6855_HW21; in ath11k_pci_probe()
860 dev_err(&pdev->dev, "Unsupported WCN6855 SOC hardware version: %d %d\n", in ath11k_pci_probe()
862 ret = -EOPNOTSUPP; in ath11k_pci_probe()
869 dev_err(&pdev->dev, "Unknown PCI device found: 0x%x\n", in ath11k_pci_probe()
870 pci_dev->device); in ath11k_pci_probe()
871 ret = -EOPNOTSUPP; in ath11k_pci_probe()
980 if (test_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags)) { in ath11k_pci_remove()
987 set_bit(ATH11K_FLAG_UNREGISTERING, &ab->dev_flags); in ath11k_pci_remove()
1018 if (test_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags)) { in ath11k_pci_pm_suspend()
1019 ath11k_dbg(ab, ATH11K_DBG_BOOT, "boot skipping pci suspend as qmi is not initialised\n"); in ath11k_pci_pm_suspend()
1035 if (test_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags)) { in ath11k_pci_pm_resume()
1036 ath11k_dbg(ab, ATH11K_DBG_BOOT, "boot skipping pci resume as qmi is not initialised\n"); in ath11k_pci_pm_resume()
1095 /* firmware files */