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

Commit 90df34f7 authored by Jordan Crouse's avatar Jordan Crouse Committed by Matt Wagantall
Browse files

msm: kgsl: Add IOCTL_KGSL_GPUOBJ_INFO



Add IOCTL_KGSL_GPUOBJ_INFO to replace IOCTL_KGSL_GPUMEM_GET_INFO
to support 64 bit GPU addressing.

Change-Id: Ic0dedbad311f49537a670c3a59bf75e0df5438a5
Signed-off-by: default avatarJordan Crouse <jcrouse@codeaurora.org>
Signed-off-by: default avatarCarter Cooper <ccooper@codeaurora.org>
parent be7e59c1
Loading
Loading
Loading
Loading
+37 −11
Original line number Diff line number Diff line
@@ -3624,22 +3624,23 @@ long kgsl_ioctl_gpumem_get_info(struct kgsl_device_private *dev_priv,

	if (param->id != 0) {
		entry = kgsl_sharedmem_find_id(private, param->id);
		if (entry == NULL) {
			KGSL_MEM_INFO(dev_priv->device, "can't find id %d\n",
					param->id);
		if (entry == NULL)
			return -EINVAL;
		}
	} else if (param->gpuaddr != 0) {
		entry = kgsl_sharedmem_find(private, (uint64_t) param->gpuaddr);
		if (entry == NULL) {
			KGSL_MEM_INFO(dev_priv->device,
					"can't find gpuaddr 0x%08lX\n",
					param->gpuaddr);
		if (entry == NULL)
			return -EINVAL;
		}
	} else {
	} else
		return -EINVAL;
	}

	/*
	 * If any of the 64 bit address / sizes would end up being
	 * truncated, return -ERANGE.  That will signal the user that they
	 * should use a more modern API
	 */
	if (entry->memdesc.gpuaddr > UINT_MAX)
		result = -ERANGE;

	param->gpuaddr = (unsigned int) entry->memdesc.gpuaddr;
	param->id = entry->id;
	param->flags = (unsigned int) entry->memdesc.flags;
@@ -3651,6 +3652,31 @@ long kgsl_ioctl_gpumem_get_info(struct kgsl_device_private *dev_priv,
	return result;
}

long kgsl_ioctl_gpuobj_info(struct kgsl_device_private *dev_priv,
		unsigned int cmd, void *data)
{
	struct kgsl_process_private *private = dev_priv->process_priv;
	struct kgsl_gpuobj_info *param = data;
	struct kgsl_mem_entry *entry;

	if (param->id == 0)
		return -EINVAL;

	entry = kgsl_sharedmem_find_id(private, param->id);
	if (entry == NULL)
		return -EINVAL;

	param->id = entry->id;
	param->gpuaddr = entry->memdesc.gpuaddr;
	param->flags = entry->memdesc.flags;
	param->size = entry->memdesc.size;
	param->va_len = kgsl_memdesc_mmapsize(&entry->memdesc);
	param->va_addr = (uint64_t) entry->memdesc.useraddr;

	kgsl_mem_entry_put(entry);
	return 0;
}

long kgsl_ioctl_cff_syncmem(struct kgsl_device_private *dev_priv,
					unsigned int cmd, void *data)
{
+2 −0
Original line number Diff line number Diff line
@@ -308,6 +308,8 @@ long kgsl_ioctl_gpuobj_alloc(struct kgsl_device_private *dev_priv,
					unsigned int cmd, void *data);
long kgsl_ioctl_gpuobj_free(struct kgsl_device_private *dev_priv,
					unsigned int cmd, void *data);
long kgsl_ioctl_gpuobj_info(struct kgsl_device_private *dev_priv,
					unsigned int cmd, void *data);

int kgsl_cmdbatch_add_memobj(struct kgsl_cmdbatch *cmdbatch,
			struct kgsl_ibdesc *ibdesc);
+2 −0
Original line number Diff line number Diff line
@@ -362,6 +362,8 @@ static const struct kgsl_ioctl kgsl_compat_ioctl_funcs[] = {
			kgsl_ioctl_gpuobj_alloc),
	KGSL_IOCTL_FUNC(IOCTL_KGSL_GPUOBJ_FREE,
			kgsl_ioctl_gpuobj_free),
	KGSL_IOCTL_FUNC(IOCTL_KGSL_GPUOBJ_INFO,
			kgsl_ioctl_gpuobj_info),
};

long kgsl_compat_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
+2 −0
Original line number Diff line number Diff line
@@ -80,6 +80,8 @@ static const struct kgsl_ioctl kgsl_ioctl_funcs[] = {
			kgsl_ioctl_gpuobj_alloc),
	KGSL_IOCTL_FUNC(IOCTL_KGSL_GPUOBJ_FREE,
			kgsl_ioctl_gpuobj_free),
	KGSL_IOCTL_FUNC(IOCTL_KGSL_GPUOBJ_INFO,
			kgsl_ioctl_gpuobj_info),
};

long kgsl_ioctl_copy_in(unsigned int kernel_cmd, unsigned int user_cmd,
+21 −0
Original line number Diff line number Diff line
@@ -1200,4 +1200,25 @@ struct kgsl_gpu_event_fence {
#define IOCTL_KGSL_GPUOBJ_FREE \
	_IOW(KGSL_IOC_TYPE, 0x46, struct kgsl_gpuobj_free)

/**
 * struct kgsl_gpuobj_info - argument to IOCTL_KGSL_GPUOBJ_INFO
 * @gpuaddr: GPU address of the object
 * @flags: Current flags for the object
 * @size: Size of the object
 * @va_len: VA size of the object
 * @va_addr: Virtual address of the object (if it is mapped)
 * id - GPU object ID of the object to query
 */
struct kgsl_gpuobj_info {
	uint64_t gpuaddr;
	uint64_t flags;
	uint64_t size;
	uint64_t va_len;
	uint64_t va_addr;
	unsigned int id;
};

#define IOCTL_KGSL_GPUOBJ_INFO \
	_IOWR(KGSL_IOC_TYPE, 0x47, struct kgsl_gpuobj_info)

#endif /* _UAPI_MSM_KGSL_H */