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

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

Merge "ARM: dts: msm: Add SMMU support on QDSS for SM8150 v2"

parents 9e2d160b 67f3a889
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -321,7 +321,12 @@
		reg-names = "tmc-base", "bam-base";

		qcom,smmu-s1-bypass;
		iommus = <&apps_smmu 0x05e0 0>;
		iommus = <&apps_smmu 0x05e0 0>,
			<&apps_smmu 0x04a0 0>;
		#address-cells = <1>;
		#size-cells = <1>;
		ranges;

		arm,buffer-size = <0x400000>;

		coresight-name = "coresight-tmc-etr";
+4 −0
Original line number Diff line number Diff line
@@ -40,6 +40,10 @@
	};
};

&tmc_etr {
	/delete-property/ qcom,smmu-s1-bypass;
};

&spss_utils {
	qcom,spss-dev-firmware-name  = "spss2d";	/* 8 chars max */
	qcom,spss-test-firmware-name = "spss2t";	/* 8 chars max */
+69 −5
Original line number Diff line number Diff line
@@ -587,9 +587,10 @@ static void tmc_etr_free_mem(struct tmc_drvdata *drvdata)
	}
}

static void tmc_etr_fill_usb_bam_data(struct tmc_drvdata *drvdata)
static int tmc_etr_fill_usb_bam_data(struct tmc_drvdata *drvdata)
{
	struct tmc_etr_bam_data *bamdata = drvdata->bamdata;
	dma_addr_t data_fifo_iova, desc_fifo_iova;

	get_qdss_bam_connection_info(&bamdata->dest,
				    &bamdata->dest_pipe_idx,
@@ -597,6 +598,28 @@ static void tmc_etr_fill_usb_bam_data(struct tmc_drvdata *drvdata)
				    &bamdata->desc_fifo,
				    &bamdata->data_fifo,
				    NULL);

	if (bamdata->props.options & SPS_BAM_SMMU_EN) {
		data_fifo_iova = dma_map_resource(drvdata->dev,
			bamdata->data_fifo.phys_base, bamdata->data_fifo.size,
			DMA_BIDIRECTIONAL, 0);
		if (!data_fifo_iova)
			return -ENOMEM;
		dev_dbg(drvdata->dev, "%s:data p_addr:%pa,iova:%pad,size:%x\n",
			__func__, &(bamdata->data_fifo.phys_base),
			&data_fifo_iova, bamdata->data_fifo.size);
		bamdata->data_fifo.iova = data_fifo_iova;
		desc_fifo_iova = dma_map_resource(drvdata->dev,
			bamdata->desc_fifo.phys_base, bamdata->desc_fifo.size,
			DMA_BIDIRECTIONAL, 0);
		if (!desc_fifo_iova)
			return -ENOMEM;
		dev_dbg(drvdata->dev, "%s:desc p_addr:%pa,iova:%pad,size:%x\n",
			__func__, &(bamdata->desc_fifo.phys_base),
			&desc_fifo_iova, bamdata->desc_fifo.size);
		bamdata->desc_fifo.iova = desc_fifo_iova;
	}
	return 0;
}

static void __tmc_etr_enable_to_bam(struct tmc_drvdata *drvdata)
@@ -625,10 +648,17 @@ static void __tmc_etr_enable_to_bam(struct tmc_drvdata *drvdata)
	axictl = (axictl & ~0x3) | 0x2;
	writel_relaxed(axictl, drvdata->base + TMC_AXICTL);

	if (bamdata->props.options & SPS_BAM_SMMU_EN) {
		writel_relaxed((uint32_t)bamdata->data_fifo.iova,
		       drvdata->base + TMC_DBALO);
		writel_relaxed((((uint64_t)bamdata->data_fifo.iova) >> 32)
			& 0xFF, drvdata->base + TMC_DBAHI);
	} else {
		writel_relaxed((uint32_t)bamdata->data_fifo.phys_base,
		       drvdata->base + TMC_DBALO);
	writel_relaxed((((uint64_t)bamdata->data_fifo.phys_base) >> 32) & 0xFF,
		       drvdata->base + TMC_DBAHI);
		writel_relaxed((((uint64_t)bamdata->data_fifo.phys_base) >> 32)
			& 0xFF, drvdata->base + TMC_DBAHI);
	}
	/* Set FOnFlIn for periodic flush */
	writel_relaxed(0x133, drvdata->base + TMC_FFCR);
	writel_relaxed(drvdata->trigger_cntr, drvdata->base + TMC_TRG);
@@ -639,9 +669,29 @@ static void __tmc_etr_enable_to_bam(struct tmc_drvdata *drvdata)
	drvdata->enable_to_bam = true;
}

static int get_usb_bam_iova(struct device *dev, unsigned long usb_bam_handle,
				unsigned long *iova)
{
	int ret = 0;
	phys_addr_t p_addr;
	u32 bam_size;

	ret = sps_get_bam_addr(usb_bam_handle, &p_addr, &bam_size);
	if (ret) {
		dev_err(dev, "sps_get_bam_addr failed at handle:%lx, err:%d\n",
			usb_bam_handle, ret);
		return ret;
	}
	*iova = dma_map_resource(dev, p_addr, bam_size, DMA_BIDIRECTIONAL, 0);
	if (!(*iova))
		return -ENOMEM;
	return 0;
}

static int tmc_etr_bam_enable(struct tmc_drvdata *drvdata)
{
	struct tmc_etr_bam_data *bamdata = drvdata->bamdata;
	unsigned long iova;
	int ret;

	if (bamdata->enable)
@@ -673,6 +723,12 @@ static int tmc_etr_bam_enable(struct tmc_drvdata *drvdata)
	bamdata->connect.desc = bamdata->desc_fifo;
	bamdata->connect.data = bamdata->data_fifo;

	if (bamdata->props.options & SPS_BAM_SMMU_EN) {
		ret = get_usb_bam_iova(drvdata->dev, bamdata->dest, &iova);
		if (ret)
			goto err1;
		bamdata->connect.dest_iova = iova;
	}
	ret = sps_connect(bamdata->pipe, &bamdata->connect);
	if (ret)
		goto err1;
@@ -739,7 +795,9 @@ void usb_notifier(void *priv, unsigned int event, struct qdss_request *d_req,

	mutex_lock(&drvdata->mem_lock);
	if (event == USB_QDSS_CONNECT) {
		tmc_etr_fill_usb_bam_data(drvdata);
		ret = tmc_etr_fill_usb_bam_data(drvdata);
		if (ret)
			dev_err(drvdata->dev, "ETR get usb bam data failed\n");
		ret = tmc_etr_bam_enable(drvdata);
		if (ret)
			dev_err(drvdata->dev, "ETR BAM enable failed\n");
@@ -784,6 +842,12 @@ int tmc_etr_bam_init(struct amba_device *adev,
	bamdata->props.summing_threshold = 0x10; /* BAM event threshold */
	bamdata->props.irq = 0;
	bamdata->props.num_pipes = TMC_ETR_BAM_NR_PIPES;
	if (device_property_present(dev, "iommus")
		&& !device_property_present(dev, "qcom,smmu-s1-bypass")) {
		pr_info("%s: setting SPS_BAM_SMMU_EN flag with (%s)\n",
		__func__, dev_name(dev));
		bamdata->props.options |= SPS_BAM_SMMU_EN;
	}

	return sps_register_bam_device(&bamdata->props, &bamdata->handle);
}
+10 −3
Original line number Diff line number Diff line
@@ -544,10 +544,17 @@ static ssize_t mem_type_store(struct device *dev,
	}
	if (!strcmp(str, str_tmc_etr_mem_type[TMC_ETR_MEM_TYPE_CONTIG]))
		drvdata->mem_type = TMC_ETR_MEM_TYPE_CONTIG;
	else if (!strcmp(str, str_tmc_etr_mem_type[TMC_ETR_MEM_TYPE_SG]))
	else if (!strcmp(str, str_tmc_etr_mem_type[TMC_ETR_MEM_TYPE_SG])) {
		if (device_property_present(dev->parent, "iommus") &&
		!device_property_present(dev->parent, "qcom,smmu-s1-bypass")) {
			mutex_unlock(&drvdata->mem_lock);
			pr_err("SMMU is enabled. Sg mode is not supported\n");
			return -EINVAL;
		}
		drvdata->mem_type = TMC_ETR_MEM_TYPE_SG;
	else
	} else {
		size = -EINVAL;
	}

	mutex_unlock(&drvdata->mem_lock);

@@ -606,7 +613,7 @@ static int tmc_iommu_init(struct tmc_drvdata *drvdata)
		return 0;

	drvdata->iommu_mapping = arm_iommu_create_mapping(&amba_bustype,
							0, (SZ_1G * 4ULL));
							0, (SZ_1G * 2ULL));
	if (IS_ERR(drvdata->iommu_mapping)) {
		dev_err(drvdata->dev, "Create mapping failed, err = %d\n", ret);
		ret = PTR_ERR(drvdata->iommu_mapping);