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

Commit 8e6e4ceb authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: kgsl: Change default pagetable creation sequence"

parents ef015e54 c46f38bc
Loading
Loading
Loading
Loading
+27 −14
Original line number Diff line number Diff line
@@ -151,10 +151,12 @@ static int kgsl_iommu_map_globals(struct kgsl_pagetable *pagetable)
			int ret = kgsl_mmu_map(pagetable,
					global_pt_entries[i].memdesc);

			if (ret)
			if (ret) {
				kgsl_iommu_unmap_globals(pagetable);
				return ret;
			}
		}
	}

	return 0;
}
@@ -1075,6 +1077,8 @@ static void kgsl_iommu_destroy_pagetable(struct kgsl_pagetable *pt)
	} else {
		ctx = &iommu->ctx[KGSL_IOMMU_CONTEXT_USER];
		kgsl_iommu_unmap_globals(pt);
		if (pt->name == KGSL_MMU_GLOBAL_PT)
			mmu->globalpt_mapped = false;
	}

	if (iommu_pt->domain) {
@@ -1308,7 +1312,6 @@ static int _init_global_pt(struct kgsl_mmu *mmu, struct kgsl_pagetable *pt)
		goto done;
	}

	ret = kgsl_iommu_map_globals(pt);

done:
	if (ret)
@@ -1611,6 +1614,18 @@ static int kgsl_iommu_init(struct kgsl_mmu *mmu)
	kgsl_setup_qdss_desc(device);
	kgsl_setup_qtimer_desc(device);

	mmu->defaultpagetable = kgsl_mmu_getpagetable(mmu,
				KGSL_MMU_GLOBAL_PT);
	/* if we don't have a default pagetable, nothing will work */
	if (IS_ERR(mmu->defaultpagetable)) {
		status = PTR_ERR(mmu->defaultpagetable);
		mmu->defaultpagetable = NULL;
		goto done;
	} else if (mmu->defaultpagetable == NULL) {
		status = -ENOMEM;
		goto done;
	}

	if (!mmu->secured)
		goto done;

@@ -1640,18 +1655,8 @@ static int _setup_user_context(struct kgsl_mmu *mmu)
	struct kgsl_iommu_pt *iommu_pt = NULL;
	unsigned int  sctlr_val;

	if (mmu->defaultpagetable == NULL) {
		mmu->defaultpagetable = kgsl_mmu_getpagetable(mmu,
				KGSL_MMU_GLOBAL_PT);
		/* if we don't have a default pagetable, nothing will work */
		if (IS_ERR(mmu->defaultpagetable)) {
			ret = PTR_ERR(mmu->defaultpagetable);
			mmu->defaultpagetable = NULL;
			return ret;
		} else if (mmu->defaultpagetable == NULL) {
	if (mmu->defaultpagetable == NULL)
		return -ENOMEM;
		}
	}

	iommu_pt = mmu->defaultpagetable->priv;
	if (iommu_pt == NULL)
@@ -1745,6 +1750,14 @@ static int kgsl_iommu_start(struct kgsl_mmu *mmu)
		return status;
	}

	if (mmu->defaultpagetable != NULL && !mmu->globalpt_mapped) {
		status = kgsl_iommu_map_globals(mmu->defaultpagetable);
		if (status)
			return status;

		mmu->globalpt_mapped = true;
	}

	/* Make sure the hardware is programmed to the default pagetable */
	return kgsl_iommu_set_pt(mmu, mmu->defaultpagetable);
}
+2 −0
Original line number Diff line number Diff line
@@ -150,6 +150,7 @@ struct kgsl_mmu_pt_ops {
 * @defaultpagetable: Default pagetable object for the MMU
 * @securepagetable: Default secure pagetable object for the MMU
 * @mmu_ops: Function pointers for the MMU sub-type
 * @globalpt_mapped: True if global pagetable entries mapped
 * @secured: True if the MMU needs to be secured
 * @feature: Static list of MMU features
 * @secure_aligned_mask: Mask that secure buffers need to be aligned to
@@ -163,6 +164,7 @@ struct kgsl_mmu {
	struct kgsl_pagetable *defaultpagetable;
	struct kgsl_pagetable *securepagetable;
	const struct kgsl_mmu_ops *mmu_ops;
	bool globalpt_mapped;
	bool secured;
	unsigned long features;
	unsigned int secure_align_mask;