mirror of
https://github.com/team-infusion-developers/android_kernel_samsung_msm8976.git
synced 2024-09-21 03:43:03 +00:00
msm: kgsl: Added DRM_IOCTL_KGSL_GEM_GET_ION_FD ioctl to DRM device.
To allow for user space ion based zero copy operations (such as camera preview) on X11 allocated buffers (e.g. Pixmaps). This ioctl returns a sharable ION file descriptor given a GEM object. Change-Id: I055712b8fa469c99a224933a1f2fd62d2d811536 Signed-off-by: Michael Street <mstreet@codeaurora.org>
This commit is contained in:
parent
423f803f58
commit
380d3a6534
|
@ -28,7 +28,7 @@
|
|||
#define DRIVER_AUTHOR "Qualcomm"
|
||||
#define DRIVER_NAME "kgsl"
|
||||
#define DRIVER_DESC "KGSL DRM"
|
||||
#define DRIVER_DATE "20100127"
|
||||
#define DRIVER_DATE "20121107"
|
||||
|
||||
#define DRIVER_MAJOR 2
|
||||
#define DRIVER_MINOR 1
|
||||
|
@ -634,6 +634,43 @@ error_fput:
|
|||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
kgsl_gem_get_ion_fd_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
struct drm_kgsl_gem_get_ion_fd *args = data;
|
||||
struct drm_gem_object *obj;
|
||||
struct drm_kgsl_gem_object *priv;
|
||||
int ret = 0;
|
||||
|
||||
obj = drm_gem_object_lookup(dev, file_priv, args->handle);
|
||||
|
||||
if (obj == NULL) {
|
||||
DRM_ERROR("Invalid GEM handle %x\n", args->handle);
|
||||
return -EBADF;
|
||||
}
|
||||
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
priv = obj->driver_private;
|
||||
|
||||
if (TYPE_IS_FD(priv->type))
|
||||
ret = -EINVAL;
|
||||
else {
|
||||
if (priv->ion_handle) {
|
||||
args->ion_fd = ion_share_dma_buf(
|
||||
kgsl_drm_ion_phys_client, priv->ion_handle);
|
||||
} else {
|
||||
DRM_ERROR("GEM object has no ion memory allocated.\n");
|
||||
ret = -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
drm_gem_object_unreference(obj);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
kgsl_gem_setmemtype_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
|
@ -1482,6 +1519,7 @@ struct drm_ioctl_desc kgsl_drm_ioctls[] = {
|
|||
DRM_IOCTL_DEF_DRV(KGSL_GEM_ALLOC, kgsl_gem_alloc_ioctl, 0),
|
||||
DRM_IOCTL_DEF_DRV(KGSL_GEM_MMAP, kgsl_gem_mmap_ioctl, 0),
|
||||
DRM_IOCTL_DEF_DRV(KGSL_GEM_GET_BUFINFO, kgsl_gem_get_bufinfo_ioctl, 0),
|
||||
DRM_IOCTL_DEF_DRV(KGSL_GEM_GET_ION_FD, kgsl_gem_get_ion_fd_ioctl, 0),
|
||||
DRM_IOCTL_DEF_DRV(KGSL_GEM_SET_BUFCOUNT,
|
||||
kgsl_gem_set_bufcount_ioctl, 0),
|
||||
DRM_IOCTL_DEF_DRV(KGSL_GEM_SET_ACTIVE, kgsl_gem_set_active_ioctl, 0),
|
||||
|
@ -1547,7 +1585,7 @@ int kgsl_drm_init(struct platform_device *dev)
|
|||
|
||||
/* Create ION Client */
|
||||
kgsl_drm_ion_phys_client = msm_ion_client_create(
|
||||
ION_HEAP_CARVEOUT_MASK, ION_SF_HEAP_NAME);
|
||||
ION_HEAP_CARVEOUT_MASK, "kgsl_drm");
|
||||
if (!kgsl_drm_ion_phys_client) {
|
||||
DRM_ERROR("Unable to create ION client\n");
|
||||
return -ENOMEM;
|
||||
|
@ -1559,5 +1597,10 @@ int kgsl_drm_init(struct platform_device *dev)
|
|||
void kgsl_drm_exit(void)
|
||||
{
|
||||
kgsl_drm_inited = DRM_KGSL_NOT_INITED;
|
||||
|
||||
if (kgsl_drm_ion_phys_client)
|
||||
ion_client_destroy(kgsl_drm_ion_phys_client);
|
||||
kgsl_drm_ion_phys_client = NULL;
|
||||
|
||||
drm_platform_exit(&driver, driver.kdriver.platform_device);
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#define DRM_KGSL_GEM_UNLOCK_HANDLE 0x0C
|
||||
#define DRM_KGSL_GEM_UNLOCK_ON_TS 0x0D
|
||||
#define DRM_KGSL_GEM_CREATE_FD 0x0E
|
||||
#define DRM_KGSL_GEM_GET_ION_FD 0x0F
|
||||
|
||||
#define DRM_IOCTL_KGSL_GEM_CREATE \
|
||||
DRM_IOWR(DRM_COMMAND_BASE + DRM_KGSL_GEM_CREATE, struct drm_kgsl_gem_create)
|
||||
|
@ -75,6 +76,10 @@ struct drm_kgsl_gem_unlock_on_ts)
|
|||
DRM_IOWR(DRM_COMMAND_BASE + DRM_KGSL_GEM_CREATE_FD, \
|
||||
struct drm_kgsl_gem_create_fd)
|
||||
|
||||
#define DRM_IOCTL_KGSL_GEM_GET_ION_FD \
|
||||
DRM_IOWR(DRM_COMMAND_BASE + DRM_KGSL_GEM_GET_ION_FD, \
|
||||
struct drm_kgsl_gem_get_ion_fd)
|
||||
|
||||
/* Maximum number of sub buffers per GEM object */
|
||||
#define DRM_KGSL_GEM_MAX_BUFFERS 2
|
||||
|
||||
|
@ -189,4 +194,9 @@ struct drm_kgsl_gem_create_fd {
|
|||
uint32_t handle;
|
||||
};
|
||||
|
||||
struct drm_kgsl_gem_get_ion_fd {
|
||||
uint32_t ion_fd;
|
||||
uint32_t handle;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue