Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fdf90263 authored by Yue Ma's avatar Yue Ma
Browse files

cnss2: Use proper DMA mask based on device ID



Refactor the code to set proper DMA mask based on device ID. Also
set MHI IOVA address range based on the same DMA mask since it will
be more easier to port the driver to non-MSM platforms where there
is no SMMU or IOMMU.

Change-Id: I2daef00b9cb96b81433ed1338b1caf37b4002d80
Signed-off-by: default avatarYue Ma <yuem@codeaurora.org>
parent 137abc55
Loading
Loading
Loading
Loading
+23 −12
Original line number Diff line number Diff line
@@ -31,8 +31,9 @@

#define PCI_BAR_NUM			0

#define PCI_DMA_MASK_32_BIT		32
#define PCI_DMA_MASK_64_BIT		64
#define PCI_DMA_MASK_32_BIT		DMA_BIT_MASK(32)
#define PCI_DMA_MASK_36_BIT		DMA_BIT_MASK(36)
#define PCI_DMA_MASK_64_BIT		DMA_BIT_MASK(64)

#define MHI_NODE_NAME			"qcom,mhi"
#define MHI_MSI_NAME			"MHI"
@@ -4057,7 +4058,6 @@ static int cnss_pci_enable_bus(struct cnss_pci_data *pci_priv)
	int ret = 0;
	struct pci_dev *pci_dev = pci_priv->pci_dev;
	u16 device_id;
	u32 pci_dma_mask = PCI_DMA_MASK_64_BIT;

	pci_read_config_word(pci_dev, PCI_DEVICE_ID, &device_id);
	if (device_id != pci_priv->pci_device_id->device)  {
@@ -4085,20 +4085,31 @@ static int cnss_pci_enable_bus(struct cnss_pci_data *pci_priv)
		goto disable_device;
	}

	if (device_id == QCA6174_DEVICE_ID)
		pci_dma_mask = PCI_DMA_MASK_32_BIT;
	switch (device_id) {
	case QCA6174_DEVICE_ID:
		pci_priv->dma_bit_mask = PCI_DMA_MASK_32_BIT;
		break;
	case QCA6390_DEVICE_ID:
	case QCA6490_DEVICE_ID:
		pci_priv->dma_bit_mask = PCI_DMA_MASK_36_BIT;
		break;
	default:
		pci_priv->dma_bit_mask = PCI_DMA_MASK_64_BIT;
		break;
	}

	ret = pci_set_dma_mask(pci_dev, DMA_BIT_MASK(pci_dma_mask));
	cnss_pr_dbg("Set PCI DMA MASK (0x%llx)\n", pci_priv->dma_bit_mask);

	ret = pci_set_dma_mask(pci_dev, pci_priv->dma_bit_mask);
	if (ret) {
		cnss_pr_err("Failed to set PCI DMA mask (%d), err = %d\n",
			    ret, pci_dma_mask);
		cnss_pr_err("Failed to set PCI DMA mask, err = %d\n", ret);
		goto release_region;
	}

	ret = pci_set_consistent_dma_mask(pci_dev, DMA_BIT_MASK(pci_dma_mask));
	ret = pci_set_consistent_dma_mask(pci_dev, pci_priv->dma_bit_mask);
	if (ret) {
		cnss_pr_err("Failed to set PCI consistent DMA mask (%d), err = %d\n",
			    ret, pci_dma_mask);
		cnss_pr_err("Failed to set PCI consistent DMA mask, err = %d\n",
			    ret);
		goto release_region;
	}

@@ -4865,7 +4876,7 @@ static int cnss_pci_register_mhi(struct cnss_pci_data *pci_priv)
					pci_priv->smmu_iova_len;
	} else {
		mhi_ctrl->iova_start = 0;
		mhi_ctrl->iova_stop = UINT_MAX;
		mhi_ctrl->iova_stop = pci_priv->dma_bit_mask;
	}

	mhi_ctrl->link_status = cnss_mhi_link_status;
+1 −0
Original line number Diff line number Diff line
@@ -80,6 +80,7 @@ struct cnss_pci_data {
	const struct pci_device_id *pci_device_id;
	u32 device_id;
	u16 revision_id;
	u64 dma_bit_mask;
	struct cnss_wlan_driver *driver_ops;
	u8 pci_link_state;
	u8 pci_link_down_ind;