Loading drivers/iommu/arm-smmu.c +23 −81 Original line number Diff line number Diff line Loading @@ -790,6 +790,28 @@ static void arm_smmu_unrequest_bus(struct arm_smmu_power_resources *pwr) WARN_ON(msm_bus_scale_client_update_request(pwr->bus_client, 0)); } static int arm_smmu_enable_regulators(struct arm_smmu_power_resources *pwr) { struct regulator_bulk_data *consumers; int num_consumers, ret; int i; num_consumers = pwr->num_gdscs; consumers = pwr->gdscs; for (i = 0; i < num_consumers; i++) { ret = regulator_enable(consumers[i].consumer); if (ret) goto out; } return 0; out: i -= 1; for (; i >= 0; i--) regulator_disable(consumers[i].consumer); return ret; } static int arm_smmu_disable_regulators(struct arm_smmu_power_resources *pwr) { struct regulator_bulk_data *consumers; Loading Loading @@ -878,7 +900,7 @@ static int arm_smmu_power_on_slow(struct arm_smmu_power_resources *pwr) if (ret) goto out_unlock; ret = regulator_bulk_enable(pwr->num_gdscs, pwr->gdscs); ret = arm_smmu_enable_regulators(pwr); if (ret) goto out_disable_bus; Loading Loading @@ -4247,36 +4269,6 @@ struct qsmmuv500_tbu_device { u32 halt_count; }; static int qsmmuv500_tbu_power_on_all(struct arm_smmu_device *smmu) { struct qsmmuv500_tbu_device *tbu; struct qsmmuv500_archdata *data = get_qsmmuv500_archdata(smmu); int ret = 0; list_for_each_entry(tbu, &data->tbus, list) { ret = arm_smmu_power_on(tbu->pwr); if (ret) break; } if (!ret) return 0; list_for_each_entry_continue_reverse(tbu, &data->tbus, list) { arm_smmu_power_off(tbu->pwr); } return ret; } static void qsmmuv500_tbu_power_off_all(struct arm_smmu_device *smmu) { struct qsmmuv500_tbu_device *tbu; struct qsmmuv500_archdata *data = get_qsmmuv500_archdata(smmu); list_for_each_entry_reverse(tbu, &data->tbus, list) { arm_smmu_power_off(tbu->pwr); } } static int qsmmuv500_tbu_halt(struct qsmmuv500_tbu_device *tbu) { unsigned long flags; Loading Loading @@ -4335,37 +4327,6 @@ static void qsmmuv500_tbu_resume(struct qsmmuv500_tbu_device *tbu) spin_unlock_irqrestore(&tbu->halt_lock, flags); } static int qsmmuv500_halt_all(struct arm_smmu_device *smmu) { struct qsmmuv500_tbu_device *tbu; struct qsmmuv500_archdata *data = get_qsmmuv500_archdata(smmu); int ret = 0; list_for_each_entry(tbu, &data->tbus, list) { ret = qsmmuv500_tbu_halt(tbu); if (ret) break; } if (!ret) return 0; list_for_each_entry_continue_reverse(tbu, &data->tbus, list) { qsmmuv500_tbu_resume(tbu); } return ret; } static void qsmmuv500_resume_all(struct arm_smmu_device *smmu) { struct qsmmuv500_tbu_device *tbu; struct qsmmuv500_archdata *data = get_qsmmuv500_archdata(smmu); list_for_each_entry(tbu, &data->tbus, list) { qsmmuv500_tbu_resume(tbu); } } static struct qsmmuv500_tbu_device *qsmmuv500_find_tbu( struct arm_smmu_device *smmu, u32 sid) { Loading @@ -4380,24 +4341,6 @@ static struct qsmmuv500_tbu_device *qsmmuv500_find_tbu( return NULL; } static void qsmmuv500_device_reset(struct arm_smmu_device *smmu) { int i, ret; struct arm_smmu_impl_def_reg *regs = smmu->impl_def_attach_registers; ret = qsmmuv500_tbu_power_on_all(smmu); if (ret) return; /* Program implementation defined registers */ qsmmuv500_halt_all(smmu); for (i = 0; i < smmu->num_impl_def_attach_registers; ++i) writel_relaxed(regs[i].value, ARM_SMMU_GR0(smmu) + regs[i].offset); qsmmuv500_resume_all(smmu); qsmmuv500_tbu_power_off_all(smmu); } static int qsmmuv500_ecats_lock(struct arm_smmu_domain *smmu_domain, struct qsmmuv500_tbu_device *tbu, unsigned long *flags) Loading Loading @@ -4635,7 +4578,6 @@ static int qsmmuv500_arch_init(struct arm_smmu_device *smmu) struct arm_smmu_arch_ops qsmmuv500_arch_ops = { .init = qsmmuv500_arch_init, .device_reset = qsmmuv500_device_reset, .iova_to_phys_hard = qsmmuv500_iova_to_phys_hard, }; Loading Loading
drivers/iommu/arm-smmu.c +23 −81 Original line number Diff line number Diff line Loading @@ -790,6 +790,28 @@ static void arm_smmu_unrequest_bus(struct arm_smmu_power_resources *pwr) WARN_ON(msm_bus_scale_client_update_request(pwr->bus_client, 0)); } static int arm_smmu_enable_regulators(struct arm_smmu_power_resources *pwr) { struct regulator_bulk_data *consumers; int num_consumers, ret; int i; num_consumers = pwr->num_gdscs; consumers = pwr->gdscs; for (i = 0; i < num_consumers; i++) { ret = regulator_enable(consumers[i].consumer); if (ret) goto out; } return 0; out: i -= 1; for (; i >= 0; i--) regulator_disable(consumers[i].consumer); return ret; } static int arm_smmu_disable_regulators(struct arm_smmu_power_resources *pwr) { struct regulator_bulk_data *consumers; Loading Loading @@ -878,7 +900,7 @@ static int arm_smmu_power_on_slow(struct arm_smmu_power_resources *pwr) if (ret) goto out_unlock; ret = regulator_bulk_enable(pwr->num_gdscs, pwr->gdscs); ret = arm_smmu_enable_regulators(pwr); if (ret) goto out_disable_bus; Loading Loading @@ -4247,36 +4269,6 @@ struct qsmmuv500_tbu_device { u32 halt_count; }; static int qsmmuv500_tbu_power_on_all(struct arm_smmu_device *smmu) { struct qsmmuv500_tbu_device *tbu; struct qsmmuv500_archdata *data = get_qsmmuv500_archdata(smmu); int ret = 0; list_for_each_entry(tbu, &data->tbus, list) { ret = arm_smmu_power_on(tbu->pwr); if (ret) break; } if (!ret) return 0; list_for_each_entry_continue_reverse(tbu, &data->tbus, list) { arm_smmu_power_off(tbu->pwr); } return ret; } static void qsmmuv500_tbu_power_off_all(struct arm_smmu_device *smmu) { struct qsmmuv500_tbu_device *tbu; struct qsmmuv500_archdata *data = get_qsmmuv500_archdata(smmu); list_for_each_entry_reverse(tbu, &data->tbus, list) { arm_smmu_power_off(tbu->pwr); } } static int qsmmuv500_tbu_halt(struct qsmmuv500_tbu_device *tbu) { unsigned long flags; Loading Loading @@ -4335,37 +4327,6 @@ static void qsmmuv500_tbu_resume(struct qsmmuv500_tbu_device *tbu) spin_unlock_irqrestore(&tbu->halt_lock, flags); } static int qsmmuv500_halt_all(struct arm_smmu_device *smmu) { struct qsmmuv500_tbu_device *tbu; struct qsmmuv500_archdata *data = get_qsmmuv500_archdata(smmu); int ret = 0; list_for_each_entry(tbu, &data->tbus, list) { ret = qsmmuv500_tbu_halt(tbu); if (ret) break; } if (!ret) return 0; list_for_each_entry_continue_reverse(tbu, &data->tbus, list) { qsmmuv500_tbu_resume(tbu); } return ret; } static void qsmmuv500_resume_all(struct arm_smmu_device *smmu) { struct qsmmuv500_tbu_device *tbu; struct qsmmuv500_archdata *data = get_qsmmuv500_archdata(smmu); list_for_each_entry(tbu, &data->tbus, list) { qsmmuv500_tbu_resume(tbu); } } static struct qsmmuv500_tbu_device *qsmmuv500_find_tbu( struct arm_smmu_device *smmu, u32 sid) { Loading @@ -4380,24 +4341,6 @@ static struct qsmmuv500_tbu_device *qsmmuv500_find_tbu( return NULL; } static void qsmmuv500_device_reset(struct arm_smmu_device *smmu) { int i, ret; struct arm_smmu_impl_def_reg *regs = smmu->impl_def_attach_registers; ret = qsmmuv500_tbu_power_on_all(smmu); if (ret) return; /* Program implementation defined registers */ qsmmuv500_halt_all(smmu); for (i = 0; i < smmu->num_impl_def_attach_registers; ++i) writel_relaxed(regs[i].value, ARM_SMMU_GR0(smmu) + regs[i].offset); qsmmuv500_resume_all(smmu); qsmmuv500_tbu_power_off_all(smmu); } static int qsmmuv500_ecats_lock(struct arm_smmu_domain *smmu_domain, struct qsmmuv500_tbu_device *tbu, unsigned long *flags) Loading Loading @@ -4635,7 +4578,6 @@ static int qsmmuv500_arch_init(struct arm_smmu_device *smmu) struct arm_smmu_arch_ops qsmmuv500_arch_ops = { .init = qsmmuv500_arch_init, .device_reset = qsmmuv500_device_reset, .iova_to_phys_hard = qsmmuv500_iova_to_phys_hard, }; Loading