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

Commit 6284f561 authored by Lin Bai's avatar Lin Bai
Browse files

cnss2: Add DOMAIN_ATTR_GEOMETRY attribute support



Use DOMAIN_ATTR_GEOMETRY domain attribute if it is configured in DTS,
to explicitly set the IOVA range for fastmap.
It will ensure that fastmap only allocates memory in its page tables
for the IOVA range declared by CNSS.

Change-Id: Ie81f11db949728c2fb85154049101271df21313d
CRs-Fixed: 2687286
Signed-off-by: default avatarLin Bai <lbai@codeaurora.org>
parent 81e1f886
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -1407,6 +1407,27 @@ static int cnss_pci_init_smmu(struct cnss_pci_data *pci_priv)
			goto release_mapping;
		}

		if (pci_priv->iommu_geometry) {
			struct iommu_domain_geometry geometry = {0};

			/* Need revisit if iova and ipa not continuous */
			CNSS_ASSERT(pci_priv->smmu_iova_start +
				    pci_priv->smmu_iova_len ==
				    pci_priv->smmu_iova_ipa_start);

			geometry.aperture_start = pci_priv->smmu_iova_start;
			geometry.aperture_end = pci_priv->smmu_iova_start +
						pci_priv->smmu_iova_len +
						pci_priv->smmu_iova_ipa_len;
			ret = iommu_domain_set_attr(mapping->domain,
						    DOMAIN_ATTR_GEOMETRY,
						    &geometry);
			/* Not fatal failure, fall-thru */
			if (ret)
				cnss_pr_err("Failed to set GEOMETRY, err = %d\n",
					    ret);
		}

		ret = iommu_domain_set_attr(mapping->domain,
					    DOMAIN_ATTR_CB_STALL_DISABLE,
					    &cb_stall_disable);
@@ -3322,6 +3343,11 @@ static int cnss_pci_get_smmu_cfg(struct cnss_plat_data *plat_priv)
		    "converged dt" : "single dt"),
		    &pci_priv->smmu_iova_ipa_start,
		    pci_priv->smmu_iova_ipa_len);

	pci_priv->iommu_geometry =
		of_property_read_bool(dev_node, "qcom,iommu-geometry");
	cnss_pr_dbg("DOMAIN_ATTR_GEOMETRY: %d\n", pci_priv->iommu_geometry);

	return 0;

out:
+2 −1
Original line number Diff line number Diff line
/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
/* Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -86,6 +86,7 @@ struct cnss_pci_data {
	struct timer_list dev_rddm_timer;
	bool disable_pc;
	struct cnss_pci_debug_reg *debug_reg;
	u32 iommu_geometry;
};

static inline void cnss_set_pci_priv(struct pci_dev *pci_dev, void *data)