Loading arch/arm64/boot/dts/qcom/sm8150-coresight.dtsi +6 −1 Original line number Diff line number Diff line Loading @@ -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"; Loading arch/arm64/boot/dts/qcom/sm8150-v2.dtsi +4 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading drivers/hwtracing/coresight/coresight-tmc-etr.c +69 −5 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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) Loading Loading @@ -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); Loading @@ -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) Loading Loading @@ -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; Loading Loading @@ -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"); Loading Loading @@ -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); } Loading drivers/hwtracing/coresight/coresight-tmc.c +10 −3 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); Loading Loading
arch/arm64/boot/dts/qcom/sm8150-coresight.dtsi +6 −1 Original line number Diff line number Diff line Loading @@ -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"; Loading
arch/arm64/boot/dts/qcom/sm8150-v2.dtsi +4 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading
drivers/hwtracing/coresight/coresight-tmc-etr.c +69 −5 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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) Loading Loading @@ -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); Loading @@ -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) Loading Loading @@ -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; Loading Loading @@ -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"); Loading Loading @@ -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); } Loading
drivers/hwtracing/coresight/coresight-tmc.c +10 −3 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); Loading