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

Commit 105aa922 authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "cnss2: Collect firmware dump after SMMU fault happens"

parents 5f788c78 45af158f
Loading
Loading
Loading
Loading
+36 −12
Original line number Diff line number Diff line
@@ -817,13 +817,25 @@ int cnss_pci_unregister_driver_hdlr(struct cnss_pci_data *pci_priv)
	return 0;
}

static int cnss_pci_smmu_fault_handler(struct iommu_domain *domain,
				       struct device *dev, unsigned long iova,
				       int flags, void *handler_token)
{
	cnss_pr_err("SMMU fault happened with IOVA 0x%lx\n", iova);

	cnss_force_fw_assert(dev);

	/* IOMMU driver requires non-zero return value to print debug info. */
	return -EINVAL;
}

static int cnss_pci_init_smmu(struct cnss_pci_data *pci_priv)
{
	int ret = 0;
	struct device *dev;
	struct dma_iommu_mapping *mapping;
	int atomic_ctx = 1, s1_bypass = 1, fast = 1, cb_stall_disable = 1,
		no_cfre = 1;
		no_cfre = 1, non_fatal_faults = 1;

	cnss_pr_dbg("Initializing SMMU\n");

@@ -845,7 +857,7 @@ static int cnss_pci_init_smmu(struct cnss_pci_data *pci_priv)
					    DOMAIN_ATTR_ATOMIC,
					    &atomic_ctx);
		if (ret) {
			pr_err("Failed to set SMMU atomic_ctx attribute, err = %d\n",
			cnss_pr_err("Failed to set SMMU atomic_ctx attribute, err = %d\n",
				    ret);
			goto release_mapping;
		}
@@ -854,7 +866,7 @@ static int cnss_pci_init_smmu(struct cnss_pci_data *pci_priv)
					    DOMAIN_ATTR_FAST,
					    &fast);
		if (ret) {
			pr_err("Failed to set SMMU fast attribute, err = %d\n",
			cnss_pr_err("Failed to set SMMU fast attribute, err = %d\n",
				    ret);
			goto release_mapping;
		}
@@ -863,7 +875,7 @@ static int cnss_pci_init_smmu(struct cnss_pci_data *pci_priv)
					    DOMAIN_ATTR_CB_STALL_DISABLE,
					    &cb_stall_disable);
		if (ret) {
			pr_err("Failed to set SMMU cb_stall_disable attribute, err = %d\n",
			cnss_pr_err("Failed to set SMMU cb_stall_disable attribute, err = %d\n",
				    ret);
			goto release_mapping;
		}
@@ -872,16 +884,28 @@ static int cnss_pci_init_smmu(struct cnss_pci_data *pci_priv)
					    DOMAIN_ATTR_NO_CFRE,
					    &no_cfre);
		if (ret) {
			pr_err("Failed to set SMMU no_cfre attribute, err = %d\n",
			cnss_pr_err("Failed to set SMMU no_cfre attribute, err = %d\n",
				    ret);
			goto release_mapping;
		}

		ret = iommu_domain_set_attr(mapping->domain,
					    DOMAIN_ATTR_NON_FATAL_FAULTS,
					    &non_fatal_faults);
		if (ret) {
			cnss_pr_err("Failed to set SMMU non_fatal_faults attribute, err = %d\n",
				    ret);
			goto release_mapping;
		}

		iommu_set_fault_handler(mapping->domain,
					cnss_pci_smmu_fault_handler, pci_priv);
	} else {
		ret = iommu_domain_set_attr(mapping->domain,
					    DOMAIN_ATTR_S1_BYPASS,
					    &s1_bypass);
		if (ret) {
			pr_err("Failed to set SMMU s1_bypass attribute, err = %d\n",
			cnss_pr_err("Failed to set SMMU s1_bypass attribute, err = %d\n",
				    ret);
			goto release_mapping;
		}
@@ -889,7 +913,7 @@ static int cnss_pci_init_smmu(struct cnss_pci_data *pci_priv)

	ret = arm_iommu_attach_device(dev, mapping);
	if (ret) {
		pr_err("Failed to attach SMMU device, err = %d\n", ret);
		cnss_pr_err("Failed to attach SMMU device, err = %d\n", ret);
		goto release_mapping;
	}