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

Commit c8616d27 authored by Kasin Li's avatar Kasin Li Committed by Gerrit - the friendly Code Review server
Browse files

drm/msm: Add Multiple Context Support API



GPU has UNSECURE domain and SECURE domain.
IOVA is allocated by get_iova and mapped and unmaped by bo_map
and bo_unmap.
Add get_ttbr0 for get and store page table of current mmu.
Add get_contextidr and get_cb_num and  msm_mmu_dev for context
management.
Remove msm_gem_get_iova_in_domain because it redundent together
with msm_gem_get_iova.

Change-Id: I91f0a6b786a4a142b8b16050c49be250c767521b
Signed-off-by: default avatarKasin Li <donglil@codeaurora.org>
Signed-off-by: default avatarYajun Li <yajunl@codeaurora.org>
parent 5934d8ae
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -51,7 +51,6 @@ msm-y := \
	msm_gem_prime.o \
	msm_gem_submit.o \
	msm_gpu.o \
	msm_iommu.o \
	msm_smmu.o \
	msm_perf.o \
	msm_rd.o \
+1 −2
Original line number Diff line number Diff line
@@ -595,8 +595,7 @@ struct msm_kms *mdp5_kms_init(struct drm_device *dev)
	mdelay(16);

	if (config->platform.iommu) {
		mmu = msm_smmu_new(&pdev->dev,
				MSM_SMMU_DOMAIN_UNSECURE);
		mmu = msm_smmu_new(dev, &pdev->dev, MSM_SMMU_DOMAIN_UNSECURE);
		if (IS_ERR(mmu)) {
			ret = PTR_ERR(mmu);
			dev_err(dev->dev, "failed to init iommu: %d\n", ret);
+1 −1
Original line number Diff line number Diff line
@@ -972,7 +972,7 @@ static int msm_ioctl_gem_info(struct drm_device *dev, void *data,
		uint32_t iova;

		/* iova is 32 bits for now, later could be 64 bits. */
		msm_gem_get_iova_in_domain(obj, MSM_SMMU_DOMAIN_GPU, &iova);
		msm_gem_get_iova(obj, MSM_SMMU_DOMAIN_GPU_UNSECURE, &iova);
		args->offset = iova;
	} else {
		args->offset = msm_gem_mmap_offset(obj);
+0 −2
Original line number Diff line number Diff line
@@ -367,8 +367,6 @@ uint64_t msm_gem_mmap_offset(struct drm_gem_object *obj);
int msm_gem_get_iova_locked(struct drm_gem_object *obj, int id,
		uint32_t *iova);
int msm_gem_get_iova(struct drm_gem_object *obj, int id, uint32_t *iova);
int msm_gem_get_iova_in_domain(struct drm_gem_object *obj,
		int domian, uint32_t *iova);
uint32_t msm_gem_iova(struct drm_gem_object *obj, int id);
struct page **msm_gem_get_pages(struct drm_gem_object *obj);
void msm_gem_put_pages(struct drm_gem_object *obj);
+0 −21
Original line number Diff line number Diff line
@@ -457,27 +457,6 @@ int msm_gem_get_iova(struct drm_gem_object *obj, int id, uint32_t *iova)
	return ret;
}

int msm_gem_get_iova_in_domain(struct drm_gem_object *obj, int domian,
	uint32_t *iova)
{
	struct msm_drm_private *priv = obj->dev->dev_private;
	struct msm_gem_object *msm_obj = to_msm_bo(obj);
	int id;
	int ret = -1;

	mutex_lock(&obj->dev->struct_mutex);
	for (id = 0; id < ARRAY_SIZE(msm_obj->domain); id++) {
		struct msm_mmu *mmu = priv->mmus[id];

		if (mmu->domain == domian) {
			ret = msm_gem_get_iova_locked(obj, id, iova);
			break;
		}
	}
	mutex_unlock(&obj->dev->struct_mutex);
	return ret;
}

/* get iova without taking a reference, used in places where you have
 * already done a 'msm_gem_get_iova()'.
 */
Loading