Loading arch/arm64/boot/dts/qcom/sm8150.dtsi +1 −1 Original line number Diff line number Diff line Loading @@ -3555,7 +3555,7 @@ ipa_smmu_uc: ipa_smmu_uc { compatible = "qcom,ipa-smmu-uc-cb"; iommus = <&apps_smmu 0x522 0x0>; qcom,iova-mapping = <0x40000000 0x20000000>; qcom,iova-mapping = <0x40400000 0x1FC00000>; }; qcom,ipa_fws { Loading drivers/platform/msm/ipa/ipa_v3/ipa_mhi_proxy.c +35 −0 Original line number Diff line number Diff line Loading @@ -681,6 +681,20 @@ static void imp_mhi_shutdown(void) imp_ctx->lpm_disabled = false; } /* unmap MHI doorbells from IPA uC SMMU */ if (!ipa3_ctx->s1_bypass_arr[IPA_SMMU_CB_UC]) { struct ipa_smmu_cb_ctx *cb = ipa3_get_smmu_ctx(IPA_SMMU_CB_UC); unsigned long iova_p; phys_addr_t pa_p; u32 size_p; imp_smmu_round_to_page(imp_ctx->dev_info.chdb_base, imp_ctx->dev_info.chdb_base, PAGE_SIZE, &iova_p, &pa_p, &size_p); iommu_unmap(cb->mapping->domain, iova_p, size_p); } } imp_ctx->state = IMP_PROBED; Loading Loading @@ -768,6 +782,27 @@ static int imp_mhi_probe_cb(struct mhi_device *mhi_dev, IMP_DBG("mapped ch db 0x%pad to mbox %d\n", &ev->props.doorbell, ev->props.uc_mbox_n); /* * Map MHI doorbells to IPA uC SMMU. * Both channel and event doorbells resides in a single page. */ if (!ipa3_ctx->s1_bypass_arr[IPA_SMMU_CB_UC]) { struct ipa_smmu_cb_ctx *cb = ipa3_get_smmu_ctx(IPA_SMMU_CB_UC); unsigned long iova_p; phys_addr_t pa_p; u32 size_p; imp_smmu_round_to_page(imp_ctx->dev_info.chdb_base, imp_ctx->dev_info.chdb_base, PAGE_SIZE, &iova_p, &pa_p, &size_p); ret = ipa3_iommu_map(cb->mapping->domain, iova_p, pa_p, size_p, IOMMU_READ | IOMMU_WRITE | IOMMU_MMIO); if (ret) goto fail; } imp_mhi_trigger_ready_ind(); mutex_unlock(&imp_ctx->mutex); Loading Loading
arch/arm64/boot/dts/qcom/sm8150.dtsi +1 −1 Original line number Diff line number Diff line Loading @@ -3555,7 +3555,7 @@ ipa_smmu_uc: ipa_smmu_uc { compatible = "qcom,ipa-smmu-uc-cb"; iommus = <&apps_smmu 0x522 0x0>; qcom,iova-mapping = <0x40000000 0x20000000>; qcom,iova-mapping = <0x40400000 0x1FC00000>; }; qcom,ipa_fws { Loading
drivers/platform/msm/ipa/ipa_v3/ipa_mhi_proxy.c +35 −0 Original line number Diff line number Diff line Loading @@ -681,6 +681,20 @@ static void imp_mhi_shutdown(void) imp_ctx->lpm_disabled = false; } /* unmap MHI doorbells from IPA uC SMMU */ if (!ipa3_ctx->s1_bypass_arr[IPA_SMMU_CB_UC]) { struct ipa_smmu_cb_ctx *cb = ipa3_get_smmu_ctx(IPA_SMMU_CB_UC); unsigned long iova_p; phys_addr_t pa_p; u32 size_p; imp_smmu_round_to_page(imp_ctx->dev_info.chdb_base, imp_ctx->dev_info.chdb_base, PAGE_SIZE, &iova_p, &pa_p, &size_p); iommu_unmap(cb->mapping->domain, iova_p, size_p); } } imp_ctx->state = IMP_PROBED; Loading Loading @@ -768,6 +782,27 @@ static int imp_mhi_probe_cb(struct mhi_device *mhi_dev, IMP_DBG("mapped ch db 0x%pad to mbox %d\n", &ev->props.doorbell, ev->props.uc_mbox_n); /* * Map MHI doorbells to IPA uC SMMU. * Both channel and event doorbells resides in a single page. */ if (!ipa3_ctx->s1_bypass_arr[IPA_SMMU_CB_UC]) { struct ipa_smmu_cb_ctx *cb = ipa3_get_smmu_ctx(IPA_SMMU_CB_UC); unsigned long iova_p; phys_addr_t pa_p; u32 size_p; imp_smmu_round_to_page(imp_ctx->dev_info.chdb_base, imp_ctx->dev_info.chdb_base, PAGE_SIZE, &iova_p, &pa_p, &size_p); ret = ipa3_iommu_map(cb->mapping->domain, iova_p, pa_p, size_p, IOMMU_READ | IOMMU_WRITE | IOMMU_MMIO); if (ret) goto fail; } imp_mhi_trigger_ready_ind(); mutex_unlock(&imp_ctx->mutex); Loading