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

Commit f81b352d authored by Kasin Li's avatar Kasin Li
Browse files

drm/msm: Don't limit number of GPU commands



The maximum number is set to 10. But it couldn't cover. the required
number of GPU commands is increased significantly when upgrade
1080P resolution to 4K.
Change the driver to limit the number of GPU commands as long as there
is sufficient system memory

Change-Id: I797b644657c1ae0131b432183e7b735fd86e6dc0
Signed-off-by: default avatarKasin Li <donglil@codeaurora.org>
parent b3818159
Loading
Loading
Loading
Loading
+16 −13
Original line number Diff line number Diff line
@@ -90,13 +90,25 @@ static inline uint32_t msm_gem_fence(struct msm_gem_object *msm_obj,
	return fence;
}

#define MAX_CMDS 10

/* Created per submit-ioctl, to track bo's and cmdstream bufs, etc,
 * associated with the cmdstream submission for synchronization (and
 * make it easier to unwind when things go wrong, etc).  This only
 * lasts for the duration of the submit-ioctl.
 */

struct msm_submit_cmd {
	uint32_t type;
	uint32_t size;  /* in dwords */
	uint32_t iova;
	uint32_t idx;   /* cmdstream buffer idx in bos[] */
};

struct msm_submit_bos {
	uint32_t flags;
	struct msm_gem_object *obj;
	uint32_t iova;
};

struct msm_gem_submit {
	struct drm_device *dev;
	struct msm_gpu *gpu;
@@ -107,17 +119,8 @@ struct msm_gem_submit {
	bool valid;
	unsigned int nr_cmds;
	unsigned int nr_bos;
	struct {
		uint32_t type;
		uint32_t size;  /* in dwords */
		uint32_t iova;
		uint32_t idx;   /* cmdstream buffer idx in bos[] */
	} cmd[MAX_CMDS];
	struct {
		uint32_t flags;
		struct msm_gem_object *obj;
		uint32_t iova;
	} bos[0];
	struct msm_submit_cmd *cmd;
	struct msm_submit_bos *bos;
};

#endif /* __MSM_GEM_H__ */
+10 −6
Original line number Diff line number Diff line
@@ -34,10 +34,11 @@ static inline void __user *to_user_ptr(u64 address)
}

static struct msm_gem_submit *submit_create(struct drm_device *dev,
		struct msm_gpu *gpu, int nr)
		struct msm_gpu *gpu, int nr_cmds, int nr_bos)
{
	struct msm_gem_submit *submit;
	int sz = sizeof(*submit) + (nr * sizeof(submit->bos[0]));
	int sz = sizeof(*submit) + (nr_bos * sizeof(submit->bos[0])) +
		(nr_cmds * sizeof(submit->cmd[0]));

	submit = kmalloc(sz, GFP_TEMPORARY | __GFP_NOWARN | __GFP_NORETRY);
	if (submit) {
@@ -48,6 +49,10 @@ static struct msm_gem_submit *submit_create(struct drm_device *dev,
		submit->nr_bos = 0;
		submit->nr_cmds = 0;

		submit->cmd = (void *)submit + sizeof(*submit);
		submit->bos = (void *)submit->cmd +
			(nr_cmds * sizeof(submit->cmd[0]));

		INIT_LIST_HEAD(&submit->bo_list);
		ww_acquire_init(&submit->ticket, &reservation_ww_class);
	}
@@ -337,13 +342,12 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,

	gpu = priv->gpu;

	if (args->nr_cmds > MAX_CMDS)
		return -EINVAL;

	mutex_lock(&dev->struct_mutex);

	submit = submit_create(dev, gpu, args->nr_bos);
	submit = submit_create(dev, gpu, args->nr_cmds, args->nr_bos);
	if (!submit) {
		DRM_ERROR("Create submit error, nr_cmds=%u, nr_bos=%u\n",
				args->nr_cmds, args->nr_bos);
		ret = -ENOMEM;
		goto out;
	}