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

Commit ca8bc9db authored by Linux Build Service Account's avatar Linux Build Service Account
Browse files

Promotion of kernel.lnx.4.4.c7-170825.

CRs      Change ID                                   Subject
--------------------------------------------------------------------------------------------------------------
2048964   I1a203ae0753b265594f616496ab8c57e0521fd9f   msm: camera: Synchronize camera open/close calls.
2092730   I644f44f202552d14762ffe1d1761b98ed5961020   drm/msm: Map buffers on demand on the submit path
2092730   Ic0dedbad30b0244e7fa3b34858d5020001b87330   drm/msm: Remove __user from __u64 data types
2092730   I32ca3c7fe2147c835a328e0c8937b45f2f3d59b9   drm/msm: Map command buffers to kernel only if required
2090525   I1b045d51b56de8488b3d7186cfa4582da664b710   msm: camera: Fix race condition in msm_sd_register.
2095648   Ia1ea10ce68ba04a72416827661b6fdc2abd48b3c   ASoC: msm: qdsp6v2: Do not reset backend pass-through mo

Change-Id: I9c01593aa88f43a9a0504529e8e07faae50fa258
CRs-Fixed: 2095648, 2048964, 2092730, 2090525
parents 93003ced fad84ac9
Loading
Loading
Loading
Loading
+0 −1
Original line number Original line Diff line number Diff line
@@ -149,7 +149,6 @@ struct msm_gem_submit {
	uint32_t fence;
	uint32_t fence;
	int ring;
	int ring;
	u32 flags;
	u32 flags;
	bool valid;
	uint64_t profile_buf_iova;
	uint64_t profile_buf_iova;
	struct drm_msm_gem_submit_profile_buffer *profile_buf;
	struct drm_msm_gem_submit_profile_buffer *profile_buf;
	bool secure;
	bool secure;
+52 −39
Original line number Original line Diff line number Diff line
@@ -212,15 +212,8 @@ static int submit_validate_objects(struct msm_gpu *gpu,
	int contended, slow_locked = -1, i, ret = 0;
	int contended, slow_locked = -1, i, ret = 0;


retry:
retry:
	submit->valid = true;

	for (i = 0; i < submit->nr_bos; i++) {
	for (i = 0; i < submit->nr_bos; i++) {
		struct msm_gem_object *msm_obj = submit->bos[i].obj;
		struct msm_gem_object *msm_obj = submit->bos[i].obj;
		struct msm_gem_address_space *aspace;
		uint64_t iova;

		aspace = (msm_obj->flags & MSM_BO_SECURE) ?
			gpu->secure_aspace : submit->aspace;


		if (slow_locked == i)
		if (slow_locked == i)
			slow_locked = -1;
			slow_locked = -1;
@@ -247,28 +240,6 @@ retry:
				goto fail;
				goto fail;
			}
			}
		}
		}

		/* if locking succeeded, pin bo: */
		ret = msm_gem_get_iova(&msm_obj->base, aspace, &iova);

		/* this would break the logic in the fail path.. there is no
		 * reason for this to happen, but just to be on the safe side
		 * let's notice if this starts happening in the future:
		 */
		WARN_ON(ret == -EDEADLK);

		if (ret)
			goto fail;

		submit->bos[i].flags |= BO_PINNED;

		if (iova == submit->bos[i].iova) {
			submit->bos[i].flags |= BO_VALID;
		} else {
			submit->bos[i].iova = iova;
			submit->bos[i].flags &= ~BO_VALID;
			submit->valid = false;
		}
	}
	}


	ww_acquire_done(&submit->ticket);
	ww_acquire_done(&submit->ticket);
@@ -297,9 +268,14 @@ fail:
	return ret;
	return ret;
}
}


static int submit_bo(struct msm_gem_submit *submit, uint32_t idx,
static int submit_bo(struct msm_gpu *gpu,
		struct msm_gem_submit *submit, uint32_t idx,
		struct msm_gem_object **obj, uint64_t *iova, bool *valid)
		struct msm_gem_object **obj, uint64_t *iova, bool *valid)
{
{
	struct msm_gem_object *msm_obj;
	struct msm_gem_address_space *aspace;
	int ret;

	if (idx >= submit->nr_bos) {
	if (idx >= submit->nr_bos) {
		DRM_ERROR("invalid buffer index: %u (out of %u)\n",
		DRM_ERROR("invalid buffer index: %u (out of %u)\n",
				idx, submit->nr_bos);
				idx, submit->nr_bos);
@@ -308,6 +284,39 @@ static int submit_bo(struct msm_gem_submit *submit, uint32_t idx,


	if (obj)
	if (obj)
		*obj = submit->bos[idx].obj;
		*obj = submit->bos[idx].obj;

	/* Only map and pin if the caller needs either the iova or valid */
	if (!iova && !valid)
		return 0;

	if (!(submit->bos[idx].flags & BO_PINNED)) {
		uint64_t buf_iova;

		msm_obj = submit->bos[idx].obj;
		aspace = (msm_obj->flags & MSM_BO_SECURE) ?
			gpu->secure_aspace : submit->aspace;

		ret = msm_gem_get_iova(&msm_obj->base, aspace, &buf_iova);

		/* this would break the logic in the fail path.. there is no
		 * reason for this to happen, but just to be on the safe side
		 * let's notice if this starts happening in the future:
		 */
		WARN_ON(ret == -EDEADLK);

		if (ret)
			return ret;

		submit->bos[idx].flags |= BO_PINNED;

		if (buf_iova == submit->bos[idx].iova) {
			submit->bos[idx].flags |= BO_VALID;
		} else {
			submit->bos[idx].iova = buf_iova;
			submit->bos[idx].flags &= ~BO_VALID;
		}
	}

	if (iova)
	if (iova)
		*iova = submit->bos[idx].iova;
		*iova = submit->bos[idx].iova;
	if (valid)
	if (valid)
@@ -317,8 +326,10 @@ static int submit_bo(struct msm_gem_submit *submit, uint32_t idx,
}
}


/* process the reloc's and patch up the cmdstream as needed: */
/* process the reloc's and patch up the cmdstream as needed: */
static int submit_reloc(struct msm_gem_submit *submit, struct msm_gem_object *obj,
static int submit_reloc(struct msm_gpu *gpu,
		uint32_t offset, uint32_t nr_relocs, uint64_t relocs)
		struct msm_gem_submit *submit,
		struct msm_gem_object *obj, uint32_t offset,
		uint32_t nr_relocs, uint64_t relocs)
{
{
	uint32_t i, last_offset = 0;
	uint32_t i, last_offset = 0;
	uint32_t *ptr;
	uint32_t *ptr;
@@ -334,6 +345,9 @@ static int submit_reloc(struct msm_gem_submit *submit, struct msm_gem_object *ob
		return -EINVAL;
		return -EINVAL;
	}
	}


	if (nr_relocs == 0)
		return 0;

	/* For now, just map the entire thing.  Eventually we probably
	/* For now, just map the entire thing.  Eventually we probably
	 * to do it page-by-page, w/ kmap() if not vmap()d..
	 * to do it page-by-page, w/ kmap() if not vmap()d..
	 */
	 */
@@ -372,7 +386,8 @@ static int submit_reloc(struct msm_gem_submit *submit, struct msm_gem_object *ob
			return -EINVAL;
			return -EINVAL;
		}
		}


		ret = submit_bo(submit, submit_reloc.reloc_idx, NULL, &iova, &valid);
		ret = submit_bo(gpu, submit, submit_reloc.reloc_idx,
				NULL, &iova, &valid);
		if (ret)
		if (ret)
			return ret;
			return ret;


@@ -482,7 +497,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
			goto out;
			goto out;
		}
		}


		ret = submit_bo(submit, submit_cmd.submit_idx,
		ret = submit_bo(gpu, submit, submit_cmd.submit_idx,
				&msm_obj, &iova, NULL);
				&msm_obj, &iova, NULL);
		if (ret)
		if (ret)
			goto out;
			goto out;
@@ -515,11 +530,9 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
				+ submit_cmd.submit_offset;
				+ submit_cmd.submit_offset;
		}
		}


		if (submit->valid)
		ret = submit_reloc(gpu, submit, msm_obj,
			continue;
				submit_cmd.submit_offset, submit_cmd.nr_relocs,

				submit_cmd.relocs);
		ret = submit_reloc(submit, msm_obj, submit_cmd.submit_offset,
				submit_cmd.nr_relocs, submit_cmd.relocs);
		if (ret)
		if (ret)
			goto out;
			goto out;
	}
	}
+6 −0
Original line number Original line Diff line number Diff line
@@ -623,6 +623,7 @@ static int camera_v4l2_open(struct file *filep)
	unsigned long opn_idx, idx;
	unsigned long opn_idx, idx;
	BUG_ON(!pvdev);
	BUG_ON(!pvdev);


	mutex_lock(&pvdev->video_drvdata_mutex);
	rc = camera_v4l2_fh_open(filep);
	rc = camera_v4l2_fh_open(filep);
	if (rc < 0) {
	if (rc < 0) {
		pr_err("%s : camera_v4l2_fh_open failed Line %d rc %d\n",
		pr_err("%s : camera_v4l2_fh_open failed Line %d rc %d\n",
@@ -693,6 +694,7 @@ static int camera_v4l2_open(struct file *filep)
	idx |= (1 << find_first_zero_bit((const unsigned long *)&opn_idx,
	idx |= (1 << find_first_zero_bit((const unsigned long *)&opn_idx,
				MSM_CAMERA_STREAM_CNT_BITS));
				MSM_CAMERA_STREAM_CNT_BITS));
	atomic_cmpxchg(&pvdev->opened, opn_idx, idx);
	atomic_cmpxchg(&pvdev->opened, opn_idx, idx);
	mutex_unlock(&pvdev->video_drvdata_mutex);


	return rc;
	return rc;


@@ -707,6 +709,7 @@ stream_fail:
vb2_q_fail:
vb2_q_fail:
	camera_v4l2_fh_release(filep);
	camera_v4l2_fh_release(filep);
fh_open_fail:
fh_open_fail:
	mutex_unlock(&pvdev->video_drvdata_mutex);
	return rc;
	return rc;
}
}


@@ -737,6 +740,7 @@ static int camera_v4l2_close(struct file *filep)
	if (WARN_ON(!session))
	if (WARN_ON(!session))
		return -EIO;
		return -EIO;


	mutex_lock(&pvdev->video_drvdata_mutex);
	mutex_lock(&session->close_lock);
	mutex_lock(&session->close_lock);
	opn_idx = atomic_read(&pvdev->opened);
	opn_idx = atomic_read(&pvdev->opened);
	mask = (1 << sp->stream_id);
	mask = (1 << sp->stream_id);
@@ -778,6 +782,7 @@ static int camera_v4l2_close(struct file *filep)
	}
	}


	camera_v4l2_fh_release(filep);
	camera_v4l2_fh_release(filep);
	mutex_unlock(&pvdev->video_drvdata_mutex);


	return 0;
	return 0;
}
}
@@ -924,6 +929,7 @@ int camera_init_v4l2(struct device *dev, unsigned int *session)


	*session = pvdev->vdev->num;
	*session = pvdev->vdev->num;
	atomic_set(&pvdev->opened, 0);
	atomic_set(&pvdev->opened, 0);
	mutex_init(&pvdev->video_drvdata_mutex);
	video_set_drvdata(pvdev->vdev, pvdev);
	video_set_drvdata(pvdev->vdev, pvdev);
	device_init_wakeup(&pvdev->vdev->dev, 1);
	device_init_wakeup(&pvdev->vdev->dev, 1);
	goto init_end;
	goto init_end;
+8 −0
Original line number Original line Diff line number Diff line
@@ -34,6 +34,7 @@


static struct v4l2_device *msm_v4l2_dev;
static struct v4l2_device *msm_v4l2_dev;
static struct list_head    ordered_sd_list;
static struct list_head    ordered_sd_list;
static struct mutex        ordered_sd_mtx;


static struct pm_qos_request msm_v4l2_pm_qos_request;
static struct pm_qos_request msm_v4l2_pm_qos_request;


@@ -409,7 +410,9 @@ int msm_sd_register(struct msm_sd_subdev *msm_subdev)
	if (WARN_ON(!msm_v4l2_dev) || WARN_ON(!msm_v4l2_dev->dev))
	if (WARN_ON(!msm_v4l2_dev) || WARN_ON(!msm_v4l2_dev->dev))
		return -EIO;
		return -EIO;


	mutex_lock(&ordered_sd_mtx);
	msm_add_sd_in_position(msm_subdev, &ordered_sd_list);
	msm_add_sd_in_position(msm_subdev, &ordered_sd_list);
	mutex_unlock(&ordered_sd_mtx);
	return __msm_sd_register_subdev(&msm_subdev->sd);
	return __msm_sd_register_subdev(&msm_subdev->sd);
}
}
EXPORT_SYMBOL(msm_sd_register);
EXPORT_SYMBOL(msm_sd_register);
@@ -811,11 +814,13 @@ static long msm_private_ioctl(struct file *file, void *fh,
				__func__);
				__func__);
		}
		}


		mutex_lock(&ordered_sd_mtx);
		if (!list_empty(&msm_v4l2_dev->subdevs)) {
		if (!list_empty(&msm_v4l2_dev->subdevs)) {
			list_for_each_entry(msm_sd, &ordered_sd_list, list)
			list_for_each_entry(msm_sd, &ordered_sd_list, list)
				__msm_sd_notify_freeze_subdevs(msm_sd,
				__msm_sd_notify_freeze_subdevs(msm_sd,
					event_data->status);
					event_data->status);
		}
		}
		mutex_unlock(&ordered_sd_mtx);
	}
	}
		break;
		break;


@@ -1000,9 +1005,11 @@ static int msm_close(struct file *filep)
	struct msm_sd_subdev *msm_sd;
	struct msm_sd_subdev *msm_sd;


	/*stop all hardware blocks immediately*/
	/*stop all hardware blocks immediately*/
	mutex_lock(&ordered_sd_mtx);
	if (!list_empty(&msm_v4l2_dev->subdevs))
	if (!list_empty(&msm_v4l2_dev->subdevs))
		list_for_each_entry(msm_sd, &ordered_sd_list, list)
		list_for_each_entry(msm_sd, &ordered_sd_list, list)
			__msm_sd_close_subdevs(msm_sd, &sd_close);
			__msm_sd_close_subdevs(msm_sd, &sd_close);
	mutex_unlock(&ordered_sd_mtx);


	/* remove msm_v4l2_pm_qos_request */
	/* remove msm_v4l2_pm_qos_request */
	msm_pm_qos_remove_request();
	msm_pm_qos_remove_request();
@@ -1358,6 +1365,7 @@ static int msm_probe(struct platform_device *pdev)
	msm_init_queue(msm_session_q);
	msm_init_queue(msm_session_q);
	spin_lock_init(&msm_eventq_lock);
	spin_lock_init(&msm_eventq_lock);
	spin_lock_init(&msm_pid_lock);
	spin_lock_init(&msm_pid_lock);
	mutex_init(&ordered_sd_mtx);
	INIT_LIST_HEAD(&ordered_sd_list);
	INIT_LIST_HEAD(&ordered_sd_list);


	cam_debugfs_root = debugfs_create_dir(MSM_CAM_LOGSYNC_FILE_BASEDIR,
	cam_debugfs_root = debugfs_create_dir(MSM_CAM_LOGSYNC_FILE_BASEDIR,
+1 −0
Original line number Original line Diff line number Diff line
@@ -46,6 +46,7 @@ extern bool is_daemon_status;
struct msm_video_device {
struct msm_video_device {
	struct video_device *vdev;
	struct video_device *vdev;
	atomic_t opened;
	atomic_t opened;
	struct mutex video_drvdata_mutex;
};
};


struct msm_queue_head {
struct msm_queue_head {
Loading